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.