Ответы:
Еще одна проблема приходит мне на ум, где cat
vs. cp
имеет существенное значение:
По определению, cat будет расширять разреженные файлы, заполняя промежутки «реальными» нулевыми байтами, в то время как cp по крайней мере можно сказать, чтобы сохранить дыры.
Разреженные файлы - это файлы, в которых последовательности нулевых байтов были заменены метаданными для экономии места. Вы можете протестировать, создав один с dd, и продублировать его с помощью инструментов по вашему выбору.
Создайте разреженный файл (предварительно изменив / tmp, чтобы избежать проблем - см. Заключительное примечание):
15> cd /tmp
16> dd if=/dev/null of=sparsetest bs=512b seek=5
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
размер его - он не должен занимать места.
17> du -sh sparsetest
0 sparsetest
скопируйте его с помощью cp и проверьте размер
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
теперь скопируйте его с помощью cat и проверьте размер
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
попробуйте предпочитаемые инструменты, чтобы проверить их поведение
не забывай убирать
Последнее предостережение: подобные эксперименты имеют врожденный шанс поднять вашу известность с вашим локальным сисадмином, если вы делаете это в файловой системе, которая является частью его плана резервного копирования, или имеет решающее значение для благополучия системы. В зависимости от выбора инструмента для резервного копирования ему может потребоваться больше ленточных носителей, чем он когда-либо считал возможным для резервного копирования одного 0-байтового файла, который расширяется до нуля терабайт.
Другие файлы, которые не могут быть скопированы ни с помощью cat, ни cp, будут включать специальные файлы устройства и т. Д. Это зависит от вашей реализации инструмента копирования, если он может дублировать узел устройства или вместо этого он будет весело копировать его содержимое.
cp
есть опция для управления своим поведением в разреженных файлах; как, с --sparse=never
указанным в командной строке, cp
так же медленно, как cat
.
Согласно комментарию Кейта , cp
сохраняет некоторые разрешения и cat
создает новый файл, как umask
указано. Так $2
что разрешение не сохраняется, что $4/vmlinuz
довольно чисто, в то время как если какое-то странное разрешение установлено $3
, оно $4/System.map
будет сохранено.
cat
скованности?
cat
быстрее?
Оба имеют эквивалентную функциональность в этих двух случаях, но cp - это чисто файловая операция. Msgstr "Возьми этот файл и сделай копию там".
С другой стороны, cat предназначена для выгрузки содержимого файла на консоль. «Возьмите этот файл и отобразите его на экране», а затем заставьте ниндзя атаковать экран и перенаправить вывод в другое место.
cp, как правило, будет более эффективным, поскольку не происходит только перенаправление, просто прямое копирование байтов из местоположения A в местоположение B.
кот будет read bytes -> output to console -> intercept output -> redirect to new file
.
cat
на самом деле это не так output to console -> intercept output -> redirect to new file
, выходной файл для cat может быть stdout или обычным файлом, он будет просто выводиться в файл, если входные данные не совпадают с выходными.
cat
не имеет ничего общего с консолью. Оба cat
и cp
читаем из входного файла и записываем в выходной файл. С cat
, выходной файл открывается с помощью оболочки, тогда как с cp
, выходной файл открывается с помощью cp
; это не имеет значения в производительности. cp
может быть быстрее, но по совершенно другой причине: некоторые реализации cp
пытаются угадать правильный размер блока для производительности в зависимости от исходного и целевого устройств; реализация cat
не будет беспокоить.
Это действительно вопрос предпочтений, ИМХО.
Технически нет реальной разницы, если вы не используете команду cp с ключом -p для сохранения владельца файла / группы. Иначе, это то же самое функционально. Ответ Марка гораздо более четкий, хотя и точный.
cp
без -p
сохранения некоторых разрешений. Например, если исходный файл является исполняемым, cp
целевой файл будет исполняемым, но cat
не будет.
cp
создает файл так же, как оригинал, в то время какcat
создает новый файл с тем же содержанием.