Di recente mi sono reso conto che possiamo usare cat
quanto dd
, ed è effettivamente più veloce di dd
So che dd
è stato utile nel trattare con nastri in cui la dimensione del blocco contava davvero per la correttezza, non solo per le prestazioni. In questi giorni, però, ci sono situazioni in cui dd
può fare qualcosa cat
non puoi? (Qui considererei irrilevante una differenza di prestazioni inferiore al 20%.)
Sarebbe bello fare degli esempi concreti!
Risposta accettata:
In apparenza, dd
è uno strumento di un sistema operativo IBM che ha mantenuto il suo aspetto estraneo (il suo passaggio di parametri), che esegue alcune funzioni utilizzate molto raramente (come conversioni EBCDIC in ASCII o inversione endianness... non è una necessità comune al giorno d'oggi).
Pensavo che dd
era più veloce per copiare grandi blocchi di dati sullo stesso disco (grazie a un uso più efficiente del buffering), ma questo non è vero, almeno sui sistemi Linux di oggi.
Penso che alcuni di dd
Le opzioni sono utili quando si ha a che fare con i nastri, dove la lettura viene effettivamente eseguita in blocchi (i driver del nastro non nascondono i blocchi sul supporto di memorizzazione come fanno i driver del disco). Ma non conosco i dettagli.
Una cosa dd
può farlo non può (facilmente) essere fatto da nessun altro strumento POSIX è prendere i primi N byte di un ruscello. Molti sistemi possono farlo con head -c 42
, ma head -c
, sebbene comune, non è in POSIX (e non è disponibile oggi, ad esempio, su OpenBSD). (tail -c
è POSIX.) Inoltre, anche dove head -c
esiste, potrebbe leggere troppi byte dalla sorgente (perché utilizza internamente il buffering stdio), il che è un problema se stai leggendo da un file speciale in cui la sola lettura ha effetto. (Le attuali coreutils GNU leggono il conteggio esatto con head -c
, ma FreeBSD e NetBSD usano stdio.)
Più in generale, dd
fornisce un'interfaccia all'API del file sottostante che è unica tra gli strumenti Unix:solo dd
può sovrascrivere o troncare un file in qualsiasi momento o cercare in un file. (Questo è dd
è l'abilità unica, ed è grande; stranamente dd
è meglio conosciuto per le cose che altri strumenti possono fare.)
- La maggior parte degli strumenti Unix sovrascrive il file di output, ovvero cancella il contenuto e ricomincia da capo. Questo è ciò che accade quando usi
>
reindirizzamento anche nella shell. - Puoi aggiungere al contenuto di un file con
>>
reindirizzamento nella shell o contee -a
. -
Se vuoi accorciare un file rimuovendo tutti i dati dopo un certo punto , questo è supportato dal kernel sottostante e dall'API C tramite
truncate
funzione, ma non esposto da alcuno strumento a riga di comando eccettodd
:dd if=/dev/null of=/file/to/truncate seek=1 bs=123456 # truncate file to 123456 bytes
-
Se vuoi sovrascrivere i dati nel mezzo di un file, ancora una volta, questo è possibile nell'API sottostante aprendo il file per la scrittura senza troncare (e chiamando
lseek
per spostarsi nella posizione desiderata se necessario), ma solodd
può aprire un file senza troncare o aggiungere, o cercare dalla shell (esempio più complesso).# 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
Quindi... Come strumento di sistema, dd
è praticamente inutile. Come strumento di elaborazione di testo (o file binario), è piuttosto prezioso!