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.