Różnica między cp -r i cp -R (polecenie kopiowania)
On 18 lutego, 2021 by admin cp -r
ma na celu rekurencyjne kopiowanie plików, i cp -R
do rekurencyjnego kopiowania katalogów. Ale sprawdziłem i wydaje się, że obie kopiują zarówno pliki, jak i katalogi, to samo. Jaka jest właściwie różnica?
Komentarze
- Każda wzmianka o tych opcjach w podręcznikach Linuksa mówi, że są one ' ponownie synonimami. (' nie są dostępne w innych wariantach systemu UNIX).
Odpowiedź
Chociaż -R
jest dobrze zdefiniowany w standardzie POSIX, -r
nie jest przenośny!
W systemie Linux w implementacje GNU i BusyBox cp
, -r
i -R
są równoważne.
Z drugiej strony, jak można przeczytać na stronie podręcznika POSIX cp
, -r
zachowanie to zdefiniowane w ramach 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.
Komentarze
- Jedna z różnic polega na tym, że na przykład w OSX
-r
skopiuje rzeczywiste pliki wskazywane przez linki symboliczne, podczas gdy-R
skopiuj dowiązanie symboliczne, co jest zamierzone w większości przypadków.
Odpowiedź
Małe litery -r
była starszą opcją, wprowadzoną w 4.1BSD, która po prostu kopiowała wszystkie niekatalogi jako pliki. Oznacza to, że gdyby napotkał urządzenie lub FIFO, otworzyłby je, przeczytał zawartość i utworzył w miejscu docelowym plik z zawartością.
Wielkie litery -R
była standardową opcją (wprowadzoną do BSD w 4.4BSD, chociaż we wcześniejszych wersjach była to synonim -r
), która po napotkaniu urządzenia, FIFO lub innego specjalnego pliku, utworzyć równoważny plik specjalny w miejscu docelowym.
Wiele implementacji nadal zachowuje to rozróżnienie, ale niektóre (w tym wersja GNU typowa dla Linuksa) zapewniają tylko -R
semantyka, z -r
jako synonimem.
Odpowiedź
Różnica polega na tym, jeden używa małej litery „R”, a drugi dużej litery „R”. Poza tym nie ma różnicy. To samo, jeśli użyjesz opcji długiej --recursive
.
Komentarze
- Ze strony podręcznika: – R, -r, –recursive – kopiuj katalogi rekurencyjnie
- @DaveJennings: To, że są równoważne na jednej platformie, nie ' nie oznacza, że są na wszystkich. W przypadku niektórych implementacji
cp
faktycznie występuje różnica. Zobacz odpowiedź Random832 ' . @Ignacio, w tej odpowiedzi należy uwzględnić kwalifikator o treści „, jeślicp
jest nowoczesną implementacją GNU ” lub coś w tym stylu. - @Caleb: Pytanie jest oznaczone tagiem ” linux „. Co innego mogłoby to być?
- -R i -r dają inne zachowanie w niektórych systemach, których używam (OS X, FreeBSD, coreutils BusyBox; nie wiem, które w tej chwili). Już dawno temu zdecydowałem, że rozsądnie będzie zawsze używać tylko
-R
, a niektóre strony podręcznika systemowego, o których wspomniałem, również to zalecają.
Odpowiedź
W OS X i starszych wersjach FreeBSD -r
jest jak -R -L --copy-contents
w coreutils lub podąża za dowiązaniami symbolicznymi i odczytuje zawartość plików specjalnych 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 w celu odczytania FIFO, a mkdir a;ln -s /dev/zero a;cp -r a b
zaczyna wypełniać b/zero
zerami .
Ze strony podręcznika cp
w systemie OS X i starszych 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
jest odpowiednikiem -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
W przypadku kopiowania rekurencyjnego skopiuj zawartość wszelkich plików specjalnych (np. FIFO i pliki urządzeń) tak, jakby były zwykłymi plikami. Oznacza to próbę odczytania danych w każdym pliku źródłowym i zapisanie ich w miejscu docelowym. Użycie tej opcji jest zwykle błędem, ponieważ normalnie ma ona niepożądany wpływ na pliki specjalne, takie jak FIFO, i te, które zwykle znajdują się w katalogu
/dev
.W większości przypadkówcp -R --copy-contents
zawiesza się na czas nieokreślony przy próbie odczytu z FIFO i plików specjalnych, takich jak/dev/console
, i zapełni dysk docelowy, jeśli używasz go do kopiowania/dev/zero
. Ta opcja nie działa, chyba że kopiuje się rekurencyjnie i nie wpływa na kopiowanie dowiązań symbolicznych.
Odpowiedź
jedna z różnic, które stwierdziłem, że -r nie kopiuje ukryte katalogi, podczas gdy -R kopiuje ukryte katalogi.
Przetestowałem go w katalogu .git w katalogu docelowym i doszedłem do powyższego wniosku. Obecnie używam centOS.
Może się mylę, ale jest to otwarte na dyskusję.
Komentarze
- Nie ' nie widzę tego w CentOS 5;
-r
i-R
kopiują ukryte katalogi
Dodaj komentarz