cp -r
służy do rekurencyjnego kopiowania plików oraz cp -R
do rekurencyjnego kopiowania katalogów. Ale sprawdziłem i oba wydają się kopiować zarówno pliki, jak i katalogi, to samo. Jaka jest właściwie różnica?
cp -r
służy do rekurencyjnego kopiowania plików oraz cp -R
do rekurencyjnego kopiowania katalogów. Ale sprawdziłem i oba wydają się kopiować zarówno pliki, jak i katalogi, to samo. Jaka jest właściwie różnica?
Odpowiedzi:
Chociaż -R
posix jest dobrze zdefiniowany, -r
nie jest przenośny!
W systemie Linux, w implementacji GNU i BusyBox z cp
, -r
i -R
są równoważne.
Z drugiej strony, jak można przeczytać na stronie podręcznika POSIXcp
, -r
zachowanie jest zdefiniowane w implementacji .
* If neither the -R nor -r options were specified, cp shall take actions based on the type and contents of the file referenced by the symbolic link, and not by the symbolic link itself. * If the -R option was specified: * If none of the options -H, -L, nor -P were specified, it is unspecified which of -H, -L, or -P will be used as a default. * If the -H option was specified, cp shall take actions based on the type and contents of the file referenced by any symbolic link specified as a source_file operand. * If the -L option was specified, cp shall take actions based on the type and contents of the file referenced by any symbolic link specified as a source_file operand or any symbolic links encoun- tered during traversal of a file hierarchy. * If the -P option was specified, cp shall copy any symbolic link specified as a source_file operand and any symbolic links encoun- tered during traversal of a file hierarchy, and shall not follow any symbolic links. * If the -r option was specified, the behavior is implementation- defined.
-r
skopiuje rzeczywiste pliki wskazane przez dowiązania symboliczne, podczas gdy -R
skopiuje dowiązanie symboliczne, które jest zamierzone przez większość czasu.
Różnica polega na tym, że jedna używa małej litery „R”, a druga używa dużej litery „R”. Poza tym nie ma różnicy. To samo, jeśli użyjesz --recursive
długiej opcji.
cp
istnieje rozróżnienie. Zobacz odpowiedź Random832 . @Ignacio powinieneś dołączyć kwalifikator do tej odpowiedzi, który mówi „jeśli twoja cp
nowoczesna implementacja GNU” lub coś takiego.
-R
tylko i faktycznie niektóre strony podręcznika systemowego w wymienionych systemach również to zalecają.
Małe litery -r
były starszą opcją, wprowadzoną w 4.1BSD, która po prostu kopiowała wszystkie pliki niebędące katalogami jako pliki. Oznacza to, że jeśli napotka urządzenie lub FIFO, otworzy je, przeczyta zawartość i utworzy plik w miejscu docelowym z zawartością.
Wielkie litery -R
były znormalizowaną opcją (wprowadzoną do BSD w 4.4BSD, chociaż wcześniejsze wersje miały to jako synonim -r
), która po napotkaniu urządzenia, FIFO lub innego pliku specjalnego utworzyłaby równoważny plik specjalny w miejscu docelowym.
Wiele implementacji wciąż utrzymuje to rozróżnienie, ale niektóre (w tym typowa dla Linuksa wersja GNU) podają tylko -R
semantykę, -r
jako synonim.
W OS X i starych wersjach FreeBSD -r
jest jak -R -L --copy-contents
w coreutils, lub podąża za dowiązaniami symbolicznymi i odczytuje zawartość specjalnych plików i FIFO.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
zastępuje dowiązanie symboliczne plikiem docelowym w OS X, mkdir a;mkfifo a/b;cp -r a c
zostaje zablokowany odczyt FIFO i mkdir a;ln -s /dev/zero a;cp -r a b
zaczyna się wypełniać b/zero
zerami.
Ze strony podręcznika cp
w OS X i starych wersjach FreeBSD:
Historic versions of the cp utility had a -r option. This implementation
supports that option; however, its use is strongly discouraged, as it
does not correctly copy special files, symbolic links, or fifo's.
W nowych wersjach FreeBSD -r
odpowiada -RL
:
Historic versions of the cp utility had a -r option. This implementation
supports that option, however, its behavior is different from historical
FreeBSD behavior. Use of this option is strongly discouraged as the
behavior is implementation-dependent. In FreeBSD, -r is a synonym for
-RL and works the same unless modified by other flags. Historical imple-
mentations of -r differ as they copy special files as normal files while
recreating a hierarchy.
http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :
--copy-contents
Jeśli kopiujesz rekurencyjnie, skopiuj zawartość dowolnych plików specjalnych (np. FIFO i plików urządzeń) tak, jakby były zwykłymi plikami. Oznacza to próbę odczytania danych w każdym pliku źródłowym i zapisania ich w miejscu docelowym. Zazwyczaj błędem jest użycie tej opcji, ponieważ zwykle ma niepożądane skutki dla specjalnych plików, takich jak FIFO i zwykle znajdujących się w
/dev
katalogu. W większości przypadkówcp -R --copy-contents
zawiesi się na czas nieokreślony, próbując czytać z FIFO i specjalnych plików, takich jak/dev/console
, i zapełni dysk docelowy, jeśli użyjesz go do kopiowania/dev/zero
. Ta opcja nie działa, chyba że kopiuje się rekurencyjnie i nie wpływa na kopiowanie dowiązań symbolicznych.
jedną z różnic stwierdziłem, że -r nie kopiuje ukrytych katalogów, podczas gdy -R kopiuje ukryte katalogi.
Przetestowałem go .git w katalogu docelowym i doszedłem do powyższego wniosku. Korzystam obecnie z centOS.
Mogę się mylić, ale jest otwarta na dyskusję.
-r
i -R
oba kopiują ukryte katalogi