Outils Unix: que faire si un fichier est nommé sans quelque chose?


9

Je me demande toujours: la plupart des outils GNU / Unix prennent des options sous la forme «moins quelque chose», parfois suivies d'un argument. Que faire si vous avez un fichier nommé moins quelque chose?

$ ls
-f
$ rm -f
$ ls
-f
$ mv -f abc
mv: missing destination file operand after `abc'
Try `mv --help' for more information.
$ cat -f
cat: invalid option -- 'f'
Try `cat --help' for more information.

ou

$ ls
-ohello.c
$ gcc -ohello -ohello.c
gcc: fatal error: no input files
compilation terminated.

C'est juste par curiosité; Je n'ai pas de cas d'utilisation pour cela.


Vous devez trouver un moyen de passer littéralement la chaîne "-f" à l'appel système. Normalement, c'est en s'échappant prudemment.
Flexo

2
À l'électeur «proche car hors sujet»: il s'agit d'une question sur la programmation shell et comment éviter un problème. C'est totalement sur le sujet pour SO. (OTOH, c'est probablement un doublon; le problème est de trouver l'autre question pertinente.)
Jonathan Leffler

Réponses:


12

Pour supprimer un fichier nommé -x, utilisez rm -- -x( --signifie fin des options) ou rm ./-x.


10

Il est assez courant de poser ce type de question dans le cadre d'un entretien. Une façon courante de gérer les fichiers avec des tirets est soit:

$ rm -- -f
$ rm ./-f

6

Une question courante sous Unix. Le principal moyen est de donner le nom de chemin complet au fichier, de sorte qu'il n'a pas de tiret devant:

$ rm -file.txt
unknown option -l

$ rm ./-file.txt    #No problem!
$ rm $PWD/-file.txt #Same thing

Certaines commandes vous permettent d'utiliser un tiret seul (ou un double tiret) pour terminer les options. Cependant, ce n'est pas nécessairement vrai avec toutes les commandes, ni même la même commande sur différents systèmes.

$ rm -- -file.txt   #Works on Linux but not on some Unix systems

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.