227 votes

Comment créer un fichier vide à partir de la ligne de commande

Comment puis-je créer un fichier vide à partir de la ligne de commande ?

3voto

Sergiy Kolodyazhnyy Points 97292

En général, la création de n'importe quelle 1 sous Linux implique open(2) , openat(2) y creat(2) les appels système (et spécifiquement avec O_CREAT drapeaux). Cela signifie que si vous appelez un utilitaire de ligne de commande qui effectue ces appels système, vous pouvez créer un nouveau fichier vide.

Le plus souvent, un nouveau nom de fichier est créé avec quelque chose comme ceci :

  • touch /tmp/new_file
  • : > /tmp/new_file
  • true > /tmp/new_file
  • > /tmp/new_file ( bash Shell uniquement )

touchez est un utilitaire autonome. Son but initial est de mettre à jour le temps d'accès et de modification d'un fichier, cependant si le fichier n'existe pas - il sera créé. Notez également qu'un nom de fichier - est traité de manière spéciale, donc si vous voulez créer un fichier nommé littéralement - vous devrez le mettre entre guillemets simples ou doubles.

En revanche, > est un opérateur de redirection de Shell pour flux de sortie (stdout) . Le site > appelle spécifiquement l'opérateur openat() l'appel système avec O_WRONLY|O_CREAT|O_TRUNC drapeaux. Cela signifie que si le nom de fichier n'existe pas - il sera créé, et s'il existe - les données seront tronquées (et donc disparues, donc > doit être utilisé avec précaution). Dans la plupart des coquilles actuelles true ou : est un élément intégré, donc faire : > /tmp/new_file va être plus efficace, bien que marginalement par rapport à touch /tmp/new_file .

Mais bien sûr, cela ne s'arrête pas là. Comme mentionné, tout ce qui peut exécuter open() , openat() et, create() Les syscalls vont créer un fichier. Donc, nous pouvons faire :

  • true|dd of=/tmp/newfile
  • truncate --size 0 /tmp/new_filename.txt
  • cp /dev/null /tmp/null_file
  • true|tee /tmp/some_other_file
  • mktemp ou tempfile ( pour créer des fichiers temporaires qui n'ont pas besoin d'exister entre deux redémarrages !)

Bien entendu, tous les utilitaires mentionnés ci-dessus ne créent pas exclusivement des fichiers. Mais ils effectuent le syscall nécessaire et cela nous permet d'adapter les commandes.


Bien sûr, au niveau de la programmation ou des scripts, nous pouvons également vouloir créer un fichier, notamment pour des raisons d'efficacité (car l'appel de commandes externes telles que touch à partir d'un script Perl ou Python nécessitera des ressources supplémentaires).

Python one-liner :

$ python -c 'import sys,os;f=sys.argv[1];os.utime(f,None) if os.path.exists(f) else open(f,"a").close' myfile.txt

On peut le rendre plus court avec ça :

$ python -c 'import sys,os;f=sys.argv[1];'$'\n''with open(f,"a"): os.utime(f,None)' mysecondfile.txt 

Et en Perl :

$ perl -e 'open(my $fh,">","/tmp/perlfile")'

1 D'autres types de fichiers, tels que les liaisons matérielles ou logicielles, les périphériques spéciaux à caractères ou à blocs, les répertoires, les tuyaux nommés ou les sockets, nécessitent des appels système entièrement différents.

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