Відповіді:
Ще одне питання мені спадає на думку, де 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створюється новий файл з тим самим вмістом.