cp vs. cat untuk menyalin file

12

cp a bdan cat a > b, apa bedanya?

Dalam skrip instal x86 dari source tree kernel Linux ( arch/x86/boot/install.sh), keduanya digunakan:

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

Mengapa mereka tidak menyimpan format yang sama jika yang satu lebih baik dari yang lain?

Qian
sumber

Jawaban:

15

Satu masalah lagi muncul di pikiran saya di mana catvs cpmembuat perbedaan yang signifikan:

Menurut definisi, cat akan memperluas file jarang, mengisi celah dengan nol "nyata" byte, sementara cp setidaknya bisa dikatakan untuk menjaga lubang.

File jarang adalah file di mana urutan nol byte telah digantikan oleh metadata untuk menghemat ruang. Anda dapat menguji dengan membuat satu dengan dd, dan menduplikatnya dengan alat pilihan Anda.

  1. Buat file jarang (ganti ke / tmp sebelumnya untuk menghindari masalah - lihat catatan akhir):

    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. ukuran itu - seharusnya tidak memakan tempat.

    17> du -sh sparsetest
    0       sparsetest
  3. salin dengan cp dan periksa ukurannya

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. sekarang salin dengan kucing dan periksa ukurannya

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. coba alat pilihan Anda untuk memeriksa perilaku mereka

  6. jangan lupa bersih-bersih.

Catatan terakhir untuk berhati-hati: Eksperimen seperti ini memiliki kemungkinan yang melekat untuk meningkatkan ketenaran Anda dengan sysadmin lokal Anda jika Anda melakukannya pada sistem file yang merupakan bagian dari rencana cadangannya, atau penting untuk kesejahteraan sistem. Bergantung pada pilihan alat cadangannya, ia mungkin membutuhkan lebih banyak media tape daripada yang pernah dianggap mungkin untuk mencadangkan satu file 0-byte yang diperluas ke terabyte nol.

File lain yang tidak dapat disalin dengan kucing atau cp tidak akan termasuk file khusus perangkat, dll. Itu tergantung pada implementasi Anda dari alat penyalinan jika ia dapat menduplikasi node perangkat, atau apakah itu akan dengan senang hati menyalin isinya sebagai gantinya.

Tatjana Heuser
sumber
1
Jadi cpbuat file seperti aslinya, sambil catbuat file baru dengan konten yang sama.
Qian
Kedua alat beroperasi pada konten, tetapi cp (setidaknya implementasi "modern") menyadari beberapa spesialisasi saat ini, seperti lubang (implementasi lama kucing akan masuk ke perangkap itu). Ada juga filesystem yang tidak mengetahui konsep file jarang, misalnya HFS + (MacOS) atau FAT (MSDOS, USB-Sticks, dll), yang menyebabkan mereka meledak hingga ukuran penuhnya. Jadi ada rasi bintang di mana cp atau kucing tidak akan membuat perbedaan dalam latihan.
Tatjana Heuser
Btw, GNU cpmemiliki opsi untuk mengontrol perilakunya pada file jarang; seperti, dengan --sparse=neverditentukan pada baris perintah, cpsama lambatnya cat.
oguz ismail
6

Menurut komentar Keith , cpmempertahankan beberapa izin, dan catmembuat file baru seperti yang umaskditunjukkan. Jadi $2izin tidak dijaga yang $4/vmlinuzcukup bersih, sementara jika beberapa izin aneh diaktifkan $3, $4/System.mapakan tetap melakukannya.

rev TheoYou
sumber
Apakah itu alasan untuk atribut cattahan luntur?
Nikhil Mulley
2
Lebih catcepat
Qian
4

Keduanya memiliki fungsionalitas yang setara dalam kedua kasus tersebut, tetapi cp adalah murni operasi file. "Ambil file ini dan buat salinannya di sana".

cat, di sisi lain, dimaksudkan untuk membuang isi file ke konsol. "Ambil file ini dan tampilkan di layar" dan kemudian mintalah seorang ninja menyerang layar dan mengarahkan ulang output ke tempat lain.

cp umumnya akan lebih efisien, karena tidak ada pengalihan saja, hanya menyalin langsung byte dari lokasi A ke lokasi B.

kucing akan menjadi read bytes -> output to console -> intercept output -> redirect to new file.


sumber
3
cattidak akan benar-benar output to console -> intercept output -> redirect to new file, file output untuk cat dapat stdout atau file normal, itu hanya akan output ke file, selama input tidak sama dengan output.
4
cattidak ada hubungannya dengan konsol. Keduanya catdan cpmembaca dari file input dan menulis ke file output. Dengan cat, file output dibuka oleh shell, sedangkan dengan cp, file output dibuka oleh cp; ini tidak membuat perbedaan dalam kinerja. cpmungkin lebih cepat, tetapi untuk alasan yang sama sekali berbeda: beberapa implementasi cpcoba tebak ukuran chunk yang tepat untuk kinerja tergantung pada sumber dan perangkat target; implementasi cattidak akan mengganggu.
Gilles 'SANGAT berhenti menjadi jahat'
2

Ini benar-benar masalah preferensi, IMHO.

Secara teknis tidak ada perbedaan nyata kecuali Anda menggunakan perintah cp dengan saklar -p untuk mempertahankan kepemilikan / grup file. Kalau tidak, itu hal yang sama secara fungsional. Namun jawaban Marc jauh lebih jelas dan akurat.

Skittles
sumber
3
cptanpa -pmempertahankan beberapa izin. Misalnya, jika file sumber dapat dieksekusi, cpakan membuat file target dapat dieksekusi, tetapi cattidak akan.
Keith Thompson
Poin bagus! Jadi vmlinuztidak akan dapat dieksekusi $2.