web-dev-qa-db-fra.com

Comment supprimer un fichier dont le nom commence par "-" (trait d'union tiret a.k.a. ou moins)?

Comment supprimer un fichier dont le nom de fichier commence par un tiret (trait d'union ou moins) -? Je suis transféré sur un serveur OSX distant et j'ai ce fichier dans mon répertoire:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

Comment diable puis-je supprimer --help d'une CLI? Ce problème est quelque chose que je rencontre sous différentes formes à l'occasion, ces fichiers sont faciles à créer, mais difficiles à éliminer.

J'ai essayé d'utiliser la barre oblique inverse

rm \-\-help

J'ai essayé des citations

rm "--help"

Comment empêcher que le caractère moins (tiret ou trait d'union) soit interprété comme une option?

377
Bryan Rehbein

Utilisez "-" pour que rm arrête l'analyse des options de ligne de commande, comme ceci:

rm -- --help
559
Vegar Nilsen

Ou vous pouvez faire

rm ./--help
236
edfuh

Utilisez find pour le faire:

find . -name '--help' -delete

Et c'est une bonne méthode car si vous avez plus de quelques fichiers comme celui-ci que vous pouvez supprimer, vous pouvez obtenir une liste d'aperçu des fichiers en exécutant simplement find sans le -delete option d'abord, puis si la liste des fichiers semble bonne, il suffit de l'exécuter à nouveau avec -delete.

En fait, vous évitez rm en faveur de find (surtout avec l'aperçu en premier) est une bonne habitude qui vous aidera à éviter les erreurs avec rm * qui vous mordra inévitablement un jour.

Notez cependant que cette recherche récursive dans tous vos sous-répertoires, vous pouvez donc l'exécuter avec une contrainte de profondeur de sous-répertoire comme celle-ci:

find . -maxdepth 1 -name '--help' -delete

ce qui limite la recherche au répertoire courant.

41
aculich

Les réponses de Vegar Nilsen et edfuh sont très bonnes et les solutions appropriées à un problème comme celui-ci.

Je veux ajouter une réponse générale à cette question qui vous permet de supprimer tout fichier avec un nom de fichier difficile. Tout d'abord, son numéro d'inode est obtenu en utilisant ls -i ou une forme de stat, puis le fichier est supprimé en recherchant les fichiers dans le répertoire en cours par numéro d'inode et en exécutant la commande rm sur le fichier avec un numéro d'inode correspondant

find . -inode <inode> -exec rm {}\;

Étant donné que les numéros d'inode sont uniques dans chaque système de fichiers, vous pouvez supprimer n'importe quel fichier en utilisant ceci; unicode ou en utilisant des caractères d'échappement. C'est toujours très ennuyeux de taper donc je recommanderais d'ajouter la ligne

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

dans votre .inputrc fichier si vous utilisez bash. Cela vous permet de parcourir la liste des complétions possibles ( pour plus d'informations ).

21
Baldur

Une solution brutale:

Perl -e "unlink '--help' or die 'Could not unlink.';"

Perl -e "rmdir '-d' or die 'Could not rmdir.';"
11
Thomas L Holaday

Linux Procédure pas à pas pour créer un fichier avec des tirets et des espaces, puis le supprimer.

FAITES ATTENTION! Ne lancez pas accidentellement un rm -rf / ou commande de suppression en cascade similaire.

Si votre fichier que vous essayez de supprimer contient des astérisques ou des barres obliques, ne pompez pas accidentellement un . ou /* ou * ou un autre caractère générique qui pourrait supprimer en cascade votre système d'exploitation.

Créez un fichier appelé "--yo yo"

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

Tout d'abord, trouvez-le avec find:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

Assurez-vous que la commande find trouve UNIQUEMENT le fichier que vous souhaitez supprimer:

Passez ensuite l'option -delete pour trouver, pour les supprimer:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Aaaannd c'est parti.

8
Eric Leschinski

Midnight Commander (mc) est le plus simple, pointez-le simplement et appuyez sur F8;)

2
Marcin

voici une solution que j'avais utilisée avant de trouver ce fil.
utilisez vim pour 'éditer' le répertoire:

vim .

puis (dans vim) sélectionnez votre fichier, appuyez sur del et confirmez la suppression.
lorsque vous avez terminé, quittez vim avec :q

1
atti

Avez-vous essayé d'ajouter le nom du répertoire en tant que préfixe:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

L'utilisation du répertoire comme préfixe du fichier en général permet d'éviter une interprétation erronée du caractère "moins" comme option de commande par la fonction analyseur.