Come riempire un file con le dimensioni desiderate?


15

Ho un file che voglio riempire fino a raggiungere 16 MiB (16777216 byte). Attualmente è 16515072 byte. La differenza è di 262144 byte.

Come lo pad?

Questo non sembra funzionare:

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144

2
@terabyte; vuoi imbottitura fisica o imbottitura logica? In altre parole; il file deve mostrare solo una dimensione di 16777216 (e può contenere buchi) o deve occupare anche quella quantità di memoria sul disco? - A proposito, la scelta di un bs=1in ddè nella mia esperienza molto costosa.
Janis,

5
truncate -s 16M thefile
frostschutz,

4
@frostschutz sarebbe una buona risposta, se dovessi postarla come risposta.
derobert,

@derobert, che cosa fanno gli utenti del sito StackExchange che inviano risposte semplici e legittime come commenti?
user1717828

@utente1717828 non sono sicuro, probabilmente una buona domanda per meta.
derobert,

Risposte:


10

Rilasciare of=largerfile.txte aggiungere stdout al file:

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt

1
seekè un'opzione giusta qui.
0andriy,

15

Oltre alle risposte per ottenere un'imbottitura fisica, puoi anche lasciare la maggior parte dello spazio di imbottitura nel file appena vuoto ("fori"), seekinserendo la nuova posizione finale del file e scrivendo un singolo carattere:

dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215

(che ha il vantaggio di essere molto più performante, in particolare con bs=1, e non occupa grandi quantità di spazio su disco aggiuntivo).

Questo metodo sembra funzionare anche senza aggiungere alcun carattere, usando if=/dev/nulle la dimensione finale del file desiderata:

dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216

Una variante performante di una soluzione di imbottitura fisica che utilizza blocchi di dimensioni maggiori è:

padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
  dd if=/dev/zero bs=$bs count=$nblocks
  dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt

3
Corretta. In questo caso truncate -s +262144 largerfile.txtsarebbe anche veloce.
don_crissti,

4

La migliore risposta qui è quella di Janis (sopra) perché ti fa dimenticare la dimensione del file corrente e il pad direttamente alla dimensione desiderata senza calcoli.

Sfrutta anche i file sparsi, che non aggiungono / dev / zero.

La risposta potrebbe essere più ordinata, perché "count" può essere 0 e ottieni ancora il riempimento:

dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216

(Modifica: questo è corretto per GNU dd, ma il comportamento di count=0è specifico della piattaforma, vedi commenti)


Ti sbagli: count=0non è specificato, ma in genere è lo stesso di quando non è countstato specificato alcun parametro. Altri problemi: ddtronca il file a 16777216 byte, ma se si spera che questo crei un buco alla fine, si sbaglia perché si dovrebbe prima scrivere i dati dopo il buco e successivamente troncarlo a una dimensione che non contiene dati .
schily

count = 0 non è come specificare nessun parametro count. Stai dicendo che dd if=/dev/zero of=somefileè lo stesso di dd if=/dev/zero of=somefile count=0? Provalo.
PeteC,

Ovviamente! count=0 è uguale a se non si specificava affatto un parametro di conteggio. Questo è vero almeno per tutte le implementazioni che sono state derivate dalle fonti originali. Provalo, sembra che tu non abbia mai lavorato con il ddcomando originale .
schily,

Non riesco a trovare alcuna documentazione che specifichi 0 come valore univoco per countindicare "ignora questo parametro". Riesci a trovarne? Senza tale documentazione, count=0significa "scrivere zero blocchi" e qualsiasi deviazione da questo è un bug ... (fonti originali o no).
PeteC,

1
Questa era la documentazione POSIX precedente a maggio 2015, quando il testo non specificato è stato corretto.
schily,

1

Devi usare dd? Se si desidera che un file abbia una lunghezza (logica) particolare, basta scrivere uno zero nella posizione desiderata. I byte tra l'estremità precedente e il byte scritto verranno visualizzati come byte nulli. Ecco un esempio usando perl.

$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file

Perché il "- 2" nella riga? Lo script scriverà un byte, quindi sottraggiamo 1 per cercare la posizione prima di quel byte. Togliamo l'altro perché la posizione di ricerca è indicizzata a zero.

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.