Scrivi n byte da un file in un altro in Bash


7

Ciao come posso scrivere nbyte da un file in un nuovo file a partire dalla kposizione usando Bash?

  • Ad esempio, se n = 60, k = 1 e dimensione del file = 100, allora: il 2o file sarebbe composto dal 1o byte fino al 60o byte e sarebbe di 60 byte
  • Ad esempio, se n = 40, k = 61 e dimensione del file = 100, allora: il 2o file sarebbe costituito dal 61 ° byte fino al 100 ° byte e avrebbe una dimensione di 40 byte

Forse stiamo lavorando con file binari e non file ASCII, quindi la concatenazione di 2 metà dovrebbe essere identica al file originale!

(È possibile con dd?)


2
Vedere dde le sue skip, counte le ibsopzioni.
Choroba,

Risposte:


11

Sì. Per la pagina man di dd , stai cercando qualcosa come:

dd bs=1 count=60 if=_filename_1_ of=_filename_2_
dd bs=1 skip=60 count=40 if=_filename_1_ of=_filename_2_

dove _filename_n_viene sostituito con un nome file effettivo.

bs=1significa che counte skipsono conteggi di byte. skipè quanti saltare; countè quanti da copiare. La modifica dei conteggi dei byte inizia da 0, non 1. Pertanto, per iniziare dal primo byte, utilizzare skip=0(o lasciare skipnon specificato).

Come funzione bash, puoi usare:

# copy_nk(n, k, infile, outfile)
copy_nk() {
    dd bs=1 count="$1" skip="$2" ${3:+if="$3"} ${4:+of="$4"}
}

e poi chiamalo come

copy_nk 60 0 infile.txt outfile.txt

(con k = 0perché i numeri di byte iniziano da zero).

Con ${3:+...}, puoi lasciare il file di output o il file di input. Per esempio,

cat infile.txt | copy_nk 60 0 > outfile.txt

Il contatore dell'indice inizia da 0 o 1. Quindi immagino che se salta sia 1ciò significa che inizia dal 2 ° byte. È corretto?
PiNewbie,

5

Ecco un altro approccio usando heade bash i gruppi di comandi:

{ head -c60 > /dev/null ; head -c40 > output.txt ; } < input.txt

Il primo headqui legge i primi 60 byte da input.txt e li invia al bucket bit.

Poiché questi headcomandi sono all'interno del gruppo di comandi, la posizione del file all'interno di input.txt verrà mantenuta. Pertanto il secondo headleggerà i successivi 40 byte (da byte 61 a 100 utilizzando l'indicizzazione basata su 1) e lo scriverà in output.txt.


In effetti questo metodo può essere generalizzato per fornire splitfunzionalità simili, ma con l'ulteriore vantaggio di poter specificare la lunghezza di ciascun file di output. Supponiamo di avere un file di 100 byte che vogliamo dividere in blocchi di dimensioni 7, 50, 23 e il resto. Potremmo fare:

{
    head -c7 > 7bytes.txt
    head -c50 > 50bytes.txt
    head -c23 > 23bytes.txt
    cat > remaining-bytes.txt
} < input.txt

3
Puoi corrompere un filesystem headaltrettanto facilmente (o più facilmente), se sei abbastanza pazzo da convogliare il suo output su un dispositivo a blocchi. Certo, non lo faresti dd, invece useresti, o qualcos'altro destinato al lavoro. Il motivo della ddspaventosa reputazione è che è abbastanza robusto da poterlo utilizzare più o meno in sicurezza per attività intrinsecamente pericolose come la clonazione di immagini del disco, se si è abbastanza attenti. Certo, alcune persone non lo fanno e rovineranno il loro disco - ma la ragione non è che hanno usato dd, è che stavano facendo casini /dev/sdain primo luogo.
Ilmari Karonen,

Molto bella! Non lo sapevo head -c.
Cxw,

1
Puoi corrompere un filesystem solo se sei in esecuzione come root. E se sei root puoi corromperlo praticamente con qualsiasi utility che scrive su file.
Barmar,

@IlmariKaronen Abbastanza giusto: ho rimosso l'anti- ddFUD non necessario .
Trauma digitale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.