Baru-baru ini saya menyadari bahwa kita dapat menggunakan cat
sebanyak dd
, dan sebenarnya lebih cepat dari dd
Saya tahu bahwa dd
berguna dalam menangani kaset di mana ukuran blok benar-benar penting dalam kebenaran, bukan hanya kinerja. Namun, pada hari-hari ini, apakah ada situasi di mana dd
bisa melakukan sesuatu cat
tidak bisa? (Di sini saya akan menganggap perbedaan kinerja kurang dari 20% tidak relevan.)
Contoh konkret akan bagus!
Jawaban yang Diterima:
Secara tampilan, dd
adalah alat dari sistem operasi IBM yang mempertahankan tampilan asingnya (penelusuran parameternya), yang melakukan beberapa fungsi yang sangat jarang digunakan (seperti konversi EBCDIC ke ASCII atau pembalikan endianness… bukan kebutuhan umum saat ini).
Dulu saya berpikir bahwa dd
lebih cepat untuk menyalin blok data yang besar pada disk yang sama (karena penggunaan buffering yang lebih efisien), tetapi ini tidak benar, setidaknya pada sistem Linux saat ini.
Saya pikir beberapa dd
Opsi ini berguna ketika berhadapan dengan kaset, di mana pembacaan benar-benar dilakukan dalam blok (driver kaset tidak menyembunyikan blok pada media penyimpanan seperti yang dilakukan driver disk). Tapi saya tidak tahu secara spesifik.
Satu hal dd
dapat melakukan itu tidak dapat (dengan mudah) dilakukan oleh alat POSIX lainnya mengambil N byte pertama dari sebuah aliran. Banyak sistem dapat melakukannya dengan head -c 42
, tetapi head -c
, meskipun umum, tidak ada di POSIX (dan tidak tersedia hari ini di misalnya OpenBSD). (tail -c
adalah POSIX.) Juga, bahkan di mana head -c
ada, itu mungkin membaca terlalu banyak byte dari sumbernya (karena menggunakan buffering stdio secara internal), yang merupakan masalah jika Anda membaca dari file khusus di mana hanya membaca memiliki efek. (GNU coreutils saat ini membaca jumlah pastinya dengan head -c
, tetapi FreeBSD dan NetBSD menggunakan stdio.)
Secara umum, dd
memberikan antarmuka ke file API yang mendasarinya yang unik di antara alat Unix:hanya dd
dapat menimpa atau memotong file kapan saja atau mencari dalam sebuah file. (Ini adalah dd
kemampuan uniknya, dan itu hebat; anehnya dd
terkenal karena hal-hal yang dapat dilakukan alat lain.)
- Kebanyakan alat Unix menimpa file keluarannya, yaitu menghapus isinya dan memulainya dari awal. Inilah yang terjadi ketika Anda menggunakan
>
pengalihan di shell juga. - Anda dapat menambahkan konten file dengan
>>
pengalihan di shell, atau dengantee -a
. -
Jika Anda ingin mempersingkat file dengan menghapus semua data setelah titik tertentu , ini didukung oleh kernel dan C API yang mendasarinya melalui
truncate
fungsi, tetapi tidak diekspos oleh alat baris perintah apa pun kecualidd
:dd if=/dev/null of=/file/to/truncate seek=1 bs=123456 # truncate file to 123456 bytes
-
Jika Anda ingin menimpa data di tengah file, sekali lagi, ini dimungkinkan di API yang mendasarinya dengan membuka file untuk menulis tanpa memotong (dan memanggil
lseek
untuk pindah ke posisi yang diinginkan jika perlu), tetapi hanyadd
dapat membuka file tanpa memotong atau menambahkan, atau mencari dari shell (contoh yang lebih kompleks).# zero out the second kB block in the file (i.e. bytes 1024 to 2047) dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
Jadi… Sebagai alat sistem, dd
cukup banyak tidak berguna. Sebagai alat pemrosesan teks (atau file biner), ini cukup berharga!