cp -rsłuży do rekurencyjnego kopiowania plików oraz cp -Rdo 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 -rsłuży do rekurencyjnego kopiowania plików oraz cp -Rdo 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ż -Rposix jest dobrze zdefiniowany, -rnie jest przenośny!
W systemie Linux, w implementacji GNU i BusyBox z cp, -ri -Rsą równoważne.
Z drugiej strony, jak można przeczytać na stronie podręcznika POSIXcp , -rzachowanie 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.
-rskopiuje rzeczywiste pliki wskazane przez dowiązania symboliczne, podczas gdy -Rskopiuje 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 --recursivedługiej opcji.
cpistnieje rozróżnienie. Zobacz odpowiedź Random832 . @Ignacio powinieneś dołączyć kwalifikator do tej odpowiedzi, który mówi „jeśli twoja cpnowoczesna implementacja GNU” lub coś takiego.
-Rtylko i faktycznie niektóre strony podręcznika systemowego w wymienionych systemach również to zalecają.
Małe litery -rbył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 -Rbył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 -Rsemantykę, -rjako synonim.
W OS X i starych wersjach FreeBSD -rjest jak -R -L --copy-contentsw 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 czastępuje dowiązanie symboliczne plikiem docelowym w OS X, mkdir a;mkfifo a/b;cp -r a czostaje zablokowany odczyt FIFO i mkdir a;ln -s /dev/zero a;cp -r a bzaczyna się wypełniać b/zerozerami.
Ze strony podręcznika cpw 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 -rodpowiada -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-contentsJeś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
/devkatalogu. W większości przypadkówcp -R --copy-contentszawiesi 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ę.
-ri -Roba kopiują ukryte katalogi