cp vs. cat, щоб скопіювати файл


12

cp a bі cat a > b, яка різниця?

У x86 скрипті встановлення дерева вихідного дерева ядра Linux ( arch/x86/boot/install.sh) використовуються обидва:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

Чому вони просто не зберігають той самий формат, якщо один кращий за інший?

Відповіді:


15

Ще одне питання мені спадає на думку, де catпорівняно cpце суттєво зміниться:

За визначенням, кішка розширюватиме розріджені файли, заповнюючи прогалини "справжніми" нульовими байтами, тоді як cp принаймні можна сказати, щоб зберегти дірки.

Рідкі файли - це файли, де послідовності з нульовими байтами були замінені метаданими для збереження місця. Ви можете протестувати, створивши одне з dd, і дублювати його за допомогою обраних інструментів.

  1. Створіть розріджений файл (попередньо змінивши / 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
    
  2. розмір - він не повинен займати місця.

    17> du -sh sparsetest
    0       sparsetest
    
  3. скопіюйте його за допомогою cp та перевірте розмір

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
    
  4. тепер скопіюйте його з котом і перевірте розмір

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
    
  5. спробуйте улюблені інструменти, щоб перевірити їх поведінку

  6. не забудьте прибрати.

Заключна застереження: подібні експерименти мають властивий шанс підняти вашу славу з місцевим систематичним адміністратором, якщо ви робите їх у файловій системі, яка є частиною його резервного плану або є критичною для добробуту системи. Залежно від вибору інструменту для резервного копіювання, йому може знадобитися більше стрічкового носія, ніж він коли-небудь вважав можливим створити резервну копію цього одного байтового 0-байтового файлу, який розширюється до нульових терабайт.

Інші файли, які неможливо скопіювати ні з cat, ні з cp, не включатимуть спеціальні файли для пристрою тощо. Це залежить від вашої реалізації інструменту копіювання, якщо він здатний дублювати вузол пристрою або якщо він замість цього міг би копіювати його вміст.


1
Так cpстворюється файл так само, як оригінал, в той час як catстворюється новий файл з тим самим вмістом.
— Циан

Обидва інструменти працюють над контентом, але cp (принаймні, "сучасні" реалізації) знає деякі особливості сьогодні, як отвори (старі реалізації cat будуть потрапляти в цю пастку). Існують також файлові системи, які не знають про концепцію розріджених файлів, наприклад HFS + (MacOS) або FAT (MSDOS, USB-палички тощо), завдяки чому вони роздуваються до повного розміру. Отже, існують сузір'я, де cp або cat не впливають на практику.
— Тетяна Хейзер

Btw, GNU cpмає можливість контролювати свою поведінку на розріджених файлах; як, із --sparse=neverвказаним у командному рядку, так cpсамо повільно cat.
— oguz ismail

6

Відповідно до коментаря Кіта , cpзберігає деякі дозволи та catстворює новий файл, як umaskвказує. Так $2дозвіл «s не зберігається , що $4/vmlinuzдосить чистий, а якщо якийсь - то дивне дозвіл встановлено на $3, $4/System.mapбуде тримати це.


в тому, що причина приписувати catшвидкість?
— Нікхіл Маллі

2
Є чи catшвидше?
— Циан

4

Обидва мають рівнозначну функціональність у цих двох випадках, але cp - це суто файлова операція. "Візьміть цей файл і зробіть його копію там".

З іншого боку, кішка призначена для викидання вмісту файлу на консоль. "Візьміть цей файл і покажіть його на екрані", а потім зробіть атаку ніндзя на екран і перенаправляйте вихід на інше місце.

cp, як правило, буде більш ефективним, оскільки перенаправлення не відбувається тільки, це лише пряма копія байтів з місця А в місце B.

кішка була б read bytes -> output to console -> intercept output -> redirect to new file.


3
catнасправді не буде output to console -> intercept output -> redirect to new file, вихідний файл для кота може бути stdout або звичайний файл, він буде просто виведений у файл, доки введення не буде таким, як вихід.

4
catне має нічого спільного з консоллю. І те, catі cpчитати з вхідного файлу та записувати у вихідний файл. З cat, вихідний файл відкривається оболонкою, тоді як з cp, вихідний файл відкривається cp; це не має різниці в продуктивності. cpможе бути швидше, але з зовсім іншої причини: деякі реалізації cpнамагаються відгадати правильний розмір шматка для продуктивності залежно від джерела та цільових пристроїв; впровадження catне турбує.
— Жил 'ТАК - перестань бути злим'

2

Це справді питання переваги, ІМХО.

Технічно немає різниці, якщо ви не використовуєте команду cp з перемикачем -p для збереження права власності на файл / групу. В іншому випадку це те саме функціонально. Відповідь Марка набагато чіткіше багатослівна, хоча і точна.


3
cpбез -pзбереження деяких дозволів. Наприклад, якщо вихідний файл виконується, cpзробить цільовий файл виконуваним, але catне буде.
— Кіт Томпсон

Влучне зауваження! Тож vmlinuzне буде виконаним, чи $2є.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.