cp -r
призначений для копіювання файлів рекурсивно, а cp -R
для копіювання каталогів рекурсивно. Але я перевірив, і, здається, обидва копіюють і файли, і каталоги, те саме. Отже, яка різниця насправді?
cp -r
призначений для копіювання файлів рекурсивно, а cp -R
для копіювання каталогів рекурсивно. Але я перевірив, і, здається, обидва копіюють і файли, і каталоги, те саме. Отже, яка різниця насправді?
Відповіді:
Хоча -R
posix добре визначений, -r
він не є портативним!
У Linux, в реалізації GNU і BusyBox з cp
, -r
і -R
еквівалентні.
З іншого боку, як ви можете прочитати на сторінці керівництва POSIXcp
, -r
поведінка визначається реалізацією .
* 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
буде скопійовано реальні файли, вказані символічними посиланнями, а -R
копіюється символічне посилання, яке саме призначене більшість разів.
Різниця полягає в тому, що один використовує малий "R", а другий використовує велику "R". Крім цього, різниці немає. Те ж саме, якщо ви використовуєте --recursive
довгий варіант.
cp
насправді існує відмінність. Дивіться відповідь Random832 . @Ignacio, ви повинні включити у цю відповідь кваліфікатора, який говорить "якщо ваша cp
сучасна реалізація GNU" або щось подібне.
-R
лише це, і насправді деякі з цих сторінок у згаданих системах також рекомендують це.
Нижній регістр -r
був старшим варіантом, введеним в 4.1BSD, який просто копіював би всі не-каталоги як файли. Тобто, якщо він зіткнувся з пристроєм або FIFO, він відкрив би його, прочитав вміст і створив файл за призначенням із вмістом.
Верхній регістр -R
- це стандартизований варіант (введений до BSD в 4.4BSD, хоча в попередніх версіях він був синонімом до -r
), який, зустрівши пристрій, FIFO або інший спеціальний файл, створить еквівалентний спеціальний файл у пункті призначення.
Багато реалізацій все ще зберігають цю відмінність, але деякі (включаючи типові для Linux версії GNU) надають лише -R
семантику -r
як синонім.
В OS X і старих версіях FreeBSD -r
подібний -R -L --copy-contents
до coreutils, або він слідує за посиланнями і читає вміст спеціальних файлів і FIFO.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
замінює симпосилання на цільовий файл в OS X, mkdir a;mkfifo a/b;cp -r a c
блокується читання FIFO та mkdir a;ln -s /dev/zero a;cp -r a b
починає заповнювати b/zero
нулі.
На cp
головній сторінці в OS X та старих версіях 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.
У нових версіях FreeBSD -r
еквівалентний -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
Якщо копіюється рекурсивно, скопіюйте вміст будь-яких спеціальних файлів (наприклад, файлів FIFO та файлів пристроїв) так, ніби вони були звичайними файлами. Це означає спробувати прочитати дані у кожному вихідному файлі та записати їх до місця призначення. Зазвичай помилково використовувати цю опцію, оскільки вона зазвичай має небажані ефекти для спеціальних файлів, таких як FIFO, та тих, які зазвичай знаходяться в
/dev
каталозі. У більшості випадків вінcp -R --copy-contents
буде нескінченно висіти, намагаючись читати з FIFO та спеціальних файлів, таких як/dev/console
, і він заповнить ваш цільовий диск, якщо ви використовуєте його для копіювання/dev/zero
. Цей параметр не має ефекту, якщо не копіюється рекурсивно, і це не впливає на копіювання символічних посилань.
одна з різниць я виявив, що -r не копіює приховані каталоги, тоді як -R копіює приховані каталоги.
Я перевірив його .git-каталог у цільовому каталозі і дійшов вище висновку. Я зараз використовую centOS.
Я можу помилятися, але це відкрито для обговорення.
-r
і -R
обидва копіюють приховані каталоги