Satu masalah lagi muncul di pikiran saya di mana cat
vs cp
membuat 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.
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
ukuran itu - seharusnya tidak memakan tempat.
17> du -sh sparsetest
0 sparsetest
salin dengan cp dan periksa ukurannya
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
sekarang salin dengan kucing dan periksa ukurannya
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
coba alat pilihan Anda untuk memeriksa perilaku mereka
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.
cp
buat file seperti aslinya, sambilcat
buat file baru dengan konten yang sama.cp
memiliki opsi untuk mengontrol perilakunya pada file jarang; seperti, dengan--sparse=never
ditentukan pada baris perintah,cp
sama lambatnyacat
.Menurut komentar Keith ,
cp
mempertahankan beberapa izin, dancat
membuat file baru seperti yangumask
ditunjukkan. Jadi$2
izin tidak dijaga yang$4/vmlinuz
cukup bersih, sementara jika beberapa izin aneh diaktifkan$3
,$4/System.map
akan tetap melakukannya.sumber
cat
tahan luntur?cat
cepatKeduanya 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
cat
tidak akan benar-benaroutput 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.cat
tidak ada hubungannya dengan konsol. Keduanyacat
dancp
membaca dari file input dan menulis ke file output. Dengancat
, file output dibuka oleh shell, sedangkan dengancp
, file output dibuka olehcp
; ini tidak membuat perbedaan dalam kinerja.cp
mungkin lebih cepat, tetapi untuk alasan yang sama sekali berbeda: beberapa implementasicp
coba tebak ukuran chunk yang tepat untuk kinerja tergantung pada sumber dan perangkat target; implementasicat
tidak akan mengganggu.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.
sumber
cp
tanpa-p
mempertahankan beberapa izin. Misalnya, jika file sumber dapat dieksekusi,cp
akan membuat file target dapat dieksekusi, tetapicat
tidak akan.vmlinuz
tidak akan dapat dieksekusi$2
.