Еще одна проблема приходит мне на ум, где 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
создает файл так же, как оригинал, в то время какcat
создает новый файл с тем же содержанием.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
не будет.vmlinuz
что не будет исполняемым,$2
есть ли .