128 votes

Comment créer un fichier d'une taille spécifique à partir d'une ligne de commande ?

Comment puis-je créer un fichier (par exemple en utilisant la fonction touch ou d'une autre manière similaire), mais avec une taille spécifique (par exemple, 14 Mo) ?

Le cas d'utilisation est de tester le FTP avec différentes tailles de fichiers. Si nous pouvons créer un fichier d'une taille spécifique, cela sera utile pour vérifier le transfert FTP, etc.

167voto

Utilice truncate :

truncate -s 14M filename

De man truncate :

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

Nota: truncate peut ne pas être disponible sur votre système, par exemple sous Mac OS X, il n'est pas installé par défaut (mais vous pouvez facilement l'installer, en utilisant macports par exemple). Dans ces cas, vous devrez peut-être utiliser dd o head à la place.

101voto

Mohsin Points 11

EDIT : La méthode la plus simple est probablement la suivante truncate d'Ashutosh Vishwa Bandhu. réponse mais comme l'a souligné @offby1 qui crée fichiers épars ce qui n'est peut-être pas ce que vous voulez. Les solutions ci-dessous créent des fichiers normaux et complets.


Les commandes suivantes créent un fichier de 14MB appelé foo :

  1. fallocate (merci à @Breakthrough qui l'a suggéré dans les commentaires et voter vers le haut Ahmed Masud's réponse ci-dessous qui le mentionne également).

    fallocate -l 14000000 foo

    Cette commande est particulièrement impressionnante puisqu'elle est aussi rapide que truncate (instantané) quelle que soit la taille du fichier désiré (contrairement aux autres solutions qui seront lentes pour les gros fichiers) et crée pourtant des fichiers normaux, pas des fichiers épars :

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
  2. Créez un fichier rempli de données aléatoires

    dd if=/dev/urandom of=foo bs=14MB count=1

                                                                              o

    head -c 14MB /dev/urandom > foo
  3. Créez un fichier rempli de \0 s :

    dd if=/dev/zero of=foo.txt bs=14MB count=1

                                                                              o

    head -c 14MB /dev/zero > foo
  4. Créez un fichier rempli avec les 14 premiers Mo de données d'un autre fichier :

    head -c 14MB bar.txt > foo
  5. Créez un fichier rempli des 14 derniers Mo de données d'un autre fichier :

    tail -c 14MB bar.txt > foo

Dans tous les exemples ci-dessus, le fichier sera 14*1000*1000 si vous voulez 14*1024*1024 , remplacer MB con M . Par exemple :

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate ne traite que les octets, il faudrait donc faire (14*1024*1024=14680064)

fallocate -l 14680064 foo

21voto

n611x007 Points 6006
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

AVERTISSEMENT dd écrasera silencieusement tout ce qui est sur lequel vous avez le droit d'écrire, si vous le spécifiez volontairement ou par accident. Assurez-vous de comprendre dd par exemple, en lisant dd --help et ne foirez pas vos lignes de commande dd, sinon vous pouvez facilement créer une perte de données irréversible. même total .

Pour commencer, if= est le fichier en entrée y of= est le fichier de sortie . Toujours vérifiez que vous avez bien compris, avant d'exécuter la commande :)

13voto

mirkobrankovic Points 927

Utiliser la magie dd ;) page de manuel

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

car 14MB*1024 = 14336KB, ou :

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

Et vous obtiendrez un fichier output.dat de 14mb, rempli de zéros :D

8voto

Gianluca Points 101

Cela devrait être le moyen le plus rapide de le faire :

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

Sinon, il suffit d'écrire un programme C ou perl rapide et sale qui cherche la position exacte et écrit un seul octet. C'est BEAUCOUP plus rapide que de déverser des données sur les blocs.

Si vous voulez éviter les fichiers épars, alors sous Linux (et peut-être d'autres systèmes) vous pouvez utiliser fallocate -l <length> de util-linux .

Si ce n'est pas disponible, et que vous avez un système compatible POSIX, vous pouvez écrire un programme rapide et sale en utilisant l'appel de la bibliothèque posix_fallocate(). posix_fallocate garantit l'allocation de l'intervalle spécifié, de sorte que vous n'aurez pas de disque plein lors de l'utilisation ultérieure de l'intervalle s'il retourne avec succès.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X