Comment puis-je créer un fichier vide à partir de la ligne de commande ?
Réponse
Trop de publicités?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
outempfile
( 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.
- Réponses précédentes
- Plus de réponses