GNU/Linux >> Linux Esercitazione >  >> Linux

Dd Vs Cat - Dd è ancora rilevante in questi giorni?

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 con tee -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 eccetto dd :

    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 solo dd 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!

Correlati:Calcolare il numero di giorni per il pagamento?
Linux
  1. 14 Utili esempi di comandi "cat" in Linux

  2. Come cat <<EOF >> un file contenente codice?

  3. trova ed elimina file o cartelle più vecchi di x giorni

  4. Comando Linux per concatenare un file a se stesso n volte

  5. Eliminazione corretta di file più vecchi di 30 giorni

16 Esempi di comandi Quick Cat in Linux

Comando Cat in Linux

10 esempi di comandi Linux Cat per principianti

Utilizzo di Cat Command in Linux con esempi

Esempi di comandi di Linux cat

Vantaggi di cat'ing file e piping a grep