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?
Utilisez "-" pour que rm arrête l'analyse des options de ligne de commande, comme ceci:
rm -- --help
Ou vous pouvez faire
rm ./--help
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.
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 ).
Une solution brutale:
Perl -e "unlink '--help' or die 'Could not unlink.';"
Perl -e "rmdir '-d' or die 'Could not rmdir.';"
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.
Midnight Commander (mc
) est le plus simple, pointez-le simplement et appuyez sur F8;)
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
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.