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


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

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


114
2018-06-18 11:14


origine


Question SO connexe: stackoverflow.com/questions/257844/... - Der Hochstapler


Réponses:


Utilisation 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

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


148
2018-06-18 11:26



sensationnel. très gentil, je ne le savais pas. - n611x007
l'homme dit tout: tronquer - réduire ou étendre la taille d'un fichier à la taille spécifiée - ssedano
Très beau effectivement. le touch n'est pas nécessaire si, vous pouvez simplement exécuter truncate -s 14M filename ça va créer filename directement. - terdon
cool ... c'est ce que je cherchais exactement ... merci @ oliver-salzburg - fasil
Cela semble créer un fichier clairsemé, alors que la réponse ci-dessous (qui utilise "dd") ne le fait pas. Je ne sais pas si la différence est importante pour vous, mais j'ai pensé que je le signalerais - offby1


EDIT: Le moyen le plus simple est probablement le truncate de Ashutosh Vishwa Bandhu répondre, mais comme indiqué par @ offby1 qui crée fichiers clairsemés qui peut ne pas être ce que vous voulez. Les solutions ci-dessous créent des fichiers normaux et complets.


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

  1. fallocate (grâce à @Percée qui l'a suggéré dans les commentaires et voter pour Ahmed Masud répondre ci-dessous qui le mentionne également.)

    fallocate -l 14000000 foo
    

    Cette commande est particulièrement impressionnante car elle est aussi rapide que truncate (instantanée) indépendamment de la taille de fichier souhaitée (contrairement aux autres solutions qui seront lentes pour les fichiers volumineux) et pourtant créer des fichiers normaux, pas clairsemés:

    $ 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éer un fichier rempli de données aléatoires

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

    ou

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

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

    ou

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

    head -c 14MB bar.txt > foo
    
  5. Créez un fichier contenant les 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 tu veux 14*1024*1024remplacer MB avec M. Par exemple:

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

fallocate ne traite que des octets, vous devriez donc le faire (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

95
2018-06-18 11:23



Merci ... Cela répondra également à mon objectif de créer un fichier de la taille souhaitée ... - fasil
Je recommande de ne pas utiliser dd s'il y a une approche plus simple, moins potentiellement destructive. - acolyte
@acolyte le serait aussi dd solution a une alternative non-dd. - terdon
L'entrée wiki dit que même dd (avec des zéros) créera un fichier fragmenté, n'est-ce pas? en.wikipedia.org/wiki/Sparse_file - Michael
@ Michael j'ai vérifié, juste pour être sûr, et aucune de mes commandes ne produit des fichiers fragmentés. le dd la commande sur la page wiki est complètement différente et n'utilise pas /dev/zero. Quant à savoir si M ou MB est plus logique, prenez le relais avec les développeurs. Les pages de manuel de tête, queue et dd tous indiquent clairement que "MB = 1000 * 1000, M = 1024 * 1024". Cela peut être différent sur d'autres * nixes. - terdon


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

ATTENTION  dd va écraser silencieusement n'importe quoi vous avez le droit d'écrire, si vous le spécifiez volontairement ou par accident. Assurez-vous de comprendre dd, par exemple. avec lecture dd --help, et vous ne boussez pas vos lignes de commande dd ou vous pouvez facilement créer des pertes de données irréversibles - même total.

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


21
2018-06-18 11:23





Utiliser la magie dd ;) page de manuel

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

cause 14 Mo * 1024 = 14336 Ko ou:

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

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


13
2018-06-18 11:20





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, écrivez simplement un programme C ou Perl rapide et sale, qui effectue une recherche à la position exacte et écrit un seul octet. Ceci est BEAUCOUP plus rapide que de transférer des données sur les blocs.

Si vous voulez éviter les fichiers fragmentés, alors sous Linux (et éventuellement 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 la plage spécifiée afin que vous n'obtiendrez pas un disque plein lors de l'utilisation ultérieure de la plage si elle retourne avec succès


8
2018-06-19 04:05





Tandis que dd est le moyen portable de le faire, les commandes mkfile et xfs_mkfile sont écrits spécifiquement à cet effet et sont plus rapides:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

Le problème est que les deux commandes ne sont pas universellement disponibles, elles ne sont donc pas adaptées à l'écriture de scripts portables. Cependant, si je le fais de manière interactive via la ligne de commande, ce sont les commandes que j'utilise.

Par défaut, les fichiers non remplis à zéro sont créés. Ils prennent tous les deux -n option pour créer des fichiers troués à la place.


5
2018-06-20 04:59





Il y a une autre option avec Perl:

perl -e 'print "a" x 1024' > file.txt

Cela créera un fichier de 1 Ko. Remplacez 1024 par n'importe quel numéro que vous aimez.


1
2017-12-11 20:00