cp -rпризначений для копіювання файлів рекурсивно, а cp -Rдля копіювання каталогів рекурсивно. Але я перевірив, і, здається, обидва копіюють і файли, і каталоги, те саме. Отже, яка різниця насправді?
cp -rпризначений для копіювання файлів рекурсивно, а cp -Rдля копіювання каталогів рекурсивно. Але я перевірив, і, здається, обидва копіюють і файли, і каталоги, те саме. Отже, яка різниця насправді?
Відповіді:
Хоча -Rposix добре визначений, -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обидва копіюють приховані каталоги