Відповіді:
Ще одне питання мені спадає на думку, де cat
порівняно cp
це суттєво зміниться:
За визначенням, кішка розширюватиме розріджені файли, заповнюючи прогалини "справжніми" нульовими байтами, тоді як 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
тепер скопіюйте його з котом і перевірте розмір
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
спробуйте улюблені інструменти, щоб перевірити їх поведінку
не забудьте прибрати.
Заключна застереження: подібні експерименти мають властивий шанс підняти вашу славу з місцевим систематичним адміністратором, якщо ви робите їх у файловій системі, яка є частиною його резервного плану або є критичною для добробуту системи. Залежно від вибору інструменту для резервного копіювання, йому може знадобитися більше стрічкового носія, ніж він коли-небудь вважав можливим створити резервну копію цього одного байтового 0-байтового файлу, який розширюється до нульових терабайт.
Інші файли, які неможливо скопіювати ні з cat, ні з cp, не включатимуть спеціальні файли для пристрою тощо. Це залежить від вашої реалізації інструменту копіювання, якщо він здатний дублювати вузол пристрою або якщо він замість цього міг би копіювати його вміст.
cp
має можливість контролювати свою поведінку на розріджених файлах; як, із --sparse=never
вказаним у командному рядку, так cp
само повільно cat
.
Відповідно до коментаря Кіта , cp
зберігає деякі дозволи та cat
створює новий файл, як umask
вказує. Так $2
дозвіл «s не зберігається , що $4/vmlinuz
досить чистий, а якщо якийсь - то дивне дозвіл встановлено на $3
, $4/System.map
буде тримати це.
cat
швидкість?
cat
швидше?
Обидва мають рівнозначну функціональність у цих двох випадках, але cp - це суто файлова операція. "Візьміть цей файл і зробіть його копію там".
З іншого боку, кішка призначена для викидання вмісту файлу на консоль. "Візьміть цей файл і покажіть його на екрані", а потім зробіть атаку ніндзя на екран і перенаправляйте вихід на інше місце.
cp, як правило, буде більш ефективним, оскільки перенаправлення не відбувається тільки, це лише пряма копія байтів з місця А в місце B.
кішка була б read bytes -> output to console -> intercept output -> redirect to new file
.
cat
насправді не буде output to console -> intercept output -> redirect to new file
, вихідний файл для кота може бути stdout або звичайний файл, він буде просто виведений у файл, доки введення не буде таким, як вихід.
cat
не має нічого спільного з консоллю. І те, cat
і cp
читати з вхідного файлу та записувати у вихідний файл. З cat
, вихідний файл відкривається оболонкою, тоді як з cp
, вихідний файл відкривається cp
; це не має різниці в продуктивності. cp
може бути швидше, але з зовсім іншої причини: деякі реалізації cp
намагаються відгадати правильний розмір шматка для продуктивності залежно від джерела та цільових пристроїв; впровадження cat
не турбує.
Це справді питання переваги, ІМХО.
Технічно немає різниці, якщо ви не використовуєте команду cp з перемикачем -p для збереження права власності на файл / групу. В іншому випадку це те саме функціонально. Відповідь Марка набагато чіткіше багатослівна, хоча і точна.
cp
без -p
збереження деяких дозволів. Наприклад, якщо вихідний файл виконується, cp
зробить цільовий файл виконуваним, але cat
не буде.
cp
створюється файл так само, як оригінал, в той час якcat
створюється новий файл з тим самим вмістом.