Comment supprimer un fichier dont le nom commence par “-” (tiret aka tiret ou moins)?

349

Comment supprimer un fichier dont le nom de fichier commence par un tiret (trait d'union ou moins) -? Je suis ssh'd 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 dans le monde puis-je supprimer --helpd'un CLI? Je rencontre parfois ce problème sous différentes formes. Ces fichiers sont faciles à créer, mais difficiles à éliminer.

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

rm \-\-help

J'ai essayé des citations

rm "--help"

Comment empêcher le caractère négatif (tiret ou trait d'union) d'être interprété comme une option?

Bryan Rehbein
la source
1
Ce serait génial si cette question était renommée "Comment supprimer un fichier dont le nom commence par -".
Sandy le
@ Sandy D'accord; Je n'aime pas normalement changer le sens d'une question, mais dans ce cas, la réponse acceptée est spécifique à ce problème
Michael Mrozek
33
Je trouve cela un peu ironique d’ rm --helpexpliquer comment supprimer les noms de fichiers commençant par a -. bonne question quand même.
Lesmana
1
@ jw013 Parfois, l'aide est facile à comprendre pour les utilisateurs expérimentés, mais elle est écrasante et déroutante pour les débutants.
iconoclaste
1
Je me suis heurté à cela sur un système utilisant la machine de BusyBox. Tout est minimal, y compris l’aide, donc rm --help n’a fourni aucun indice.
Dslake

Réponses:

497

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

rm -- --help
Vegar Nilsen
la source
1
Je savais que c'était quelque chose de très simple comme celui-ci ...
Bryan Rehbein
2
Toutes les versions de la rmcommande prennent-elles en charge l' --argument?
Keith Thompson
3
@KeithThompson - est une fonctionnalité de la plupart des outils GNU, donc cela ne fonctionnera pas sur la plupart des Unix'es non-GNU ("non-Linux") (par exemple, les variantes BSD ou certains systèmes embarqués)
dtech
1
MERCI! Cela m'a sauvé la journée. Et bien sûr, cela fonctionne sur BSD (OSX) et avec d'autres commandes!
Raskhadafi
8
@dtech, getopt () et --sont antérieurs à GNU (SysIII, 1980) et sont standard / POSIX. Les utilitaires standard, à quelques exceptions près (comme echo), comprennent --. YMMV pour d’autres commandes s’ils n’utilisent pas l’API getopt () pour analyser les options.
Stéphane Chazelas
214

Ou tu peux faire

rm ./--help
Edfuh
la source
7
Ce n’est pas le cas, mais c’est ce qui nous semble le plus "approprié".
James M.
2
C'est celui dont je me souviens. Utiliser "rm - --help" est quelque chose que je dois toujours regarder.
user603
25
Cette méthode fonctionne toujours même pour les commandes qui ne sont pas traitées --spécialement.
Jw013
Et cela fonctionne aussi pour éviter un traitement spécial par certaines commandes pour d' autres types ( à côté des options) des arguments spécialement désignés comme -des services publics de texte ou cd, le foo=barde awk...
Stéphane Chazelas
1
Cela fonctionne lorsqu'un fichier commence par un tiret unique, sinon rm -- <filename>.
StockB
37

Utilisez findpour le faire:

find . -name '--help' -delete

Et c’est une bonne méthode car si vous avez plusieurs fichiers de ce type que vous pouvez supprimer, vous pouvez obtenir une liste de prévisualisation des fichiers en exécutant simplement find sans l’ -deleteoption en premier, puis si la liste des fichiers est correcte, exécutez-la. encore avec -delete.

En fait, éviter rmen faveur find(surtout avec la prévisualisation en premier) est une bonne habitude qui vous aidera à éviter les erreurs avec rm *qui vous mordra inévitablement un jour.

Notez cependant que find trouvera 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 en cours.

aculich
la source
De manière portable, vous devez donner findune liste de fichiers / répertoires à examiner. Donc find . -name.... -deleteet -maxdepthne sont pas des options standard non plus.
Stéphane Chazelas
21

Les réponses de Vegar Nilsen et d’edfuh sont très bonnes et constituent les solutions appropriées à un problème de ce type.

Je souhaite ajouter une réponse générale à cette question qui vous permet de supprimer tout fichier portant un nom de fichier difficile. Tout d'abord, son numéro d'inode est obtenu à l'aide de ls -iou sous une forme quelconque stat, puis le fichier est supprimé en recherchant des fichiers dans le répertoire actuel par numéro d'inode et en exécutant la rmcommande sur le fichier avec un numéro d'inode correspondant.

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

Les numéros d'inode étant uniques dans chaque système de fichiers, vous pouvez supprimer n'importe quel fichier à l'aide de cette option. unicode ou en utilisant des caractères d'échappement. Il est très ennuyeux de taper, je recommande donc d’ajouter la ligne.

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

dans votre .inputrcfichier si vous utilisez bash. Cela vous permet de parcourir la liste des achèvements possibles ( pour plus d'informations ).

Baldur
la source
5
Cette manière de procéder pose deux problèmes: 1) n’utilisez pas -exec lorsque vous pouvez utiliser -delete; 2) L'obtention de l'inode et son utilisation sont inutilement trop compliquées lorsqu'on peut simplement utiliser:find -name '--help' -delete
aculich,
Je ne pense pas que ça va marcher. Il parcourt tous les fichiers du répertoire en cours et tous ses sous-répertoires, et après tout ce qu'il appelle encorerm --help , ce qui ne supprime toujours pas le fichier. Il suffit d'utiliser rm ./--help(ou rm -i *.
Keith Thompson
1
@KeithThompson findpréfixe le chemin d'accès aux arguments de la ligne de commande pour tous les fichiers, de sorte qu'il s'exécute rm ./--helpet rm ./sub/dirs/--help. Pour résoudre le second problème, il faudrait ajouter -maxdepth 1, mais tout cela s’applique essentiellement à la solution de @ edfuh d’une manière plus détournée, plus alambiquée et -deleteplus sûre que de -exec rmtoute façon.
Jw013
1
Un autre problème avec cette commande est qu'il doit y avoir un espace entre {}et \;, sinon cela ne fonctionnera pas.
Eugene S
Les inodes peuvent être uniques mais il peut y avoir plusieurs entrées de répertoire avec le même inode. Celles-ci sont appelées liens durs. Et ils ne sont uniques que par système de fichiers, vous devez donc les utiliser -xdev. Cela ne vous aidera pas à gérer cela ls -i --help.
Stéphane Chazelas
11

Une solution brutale:

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

perl -e "rmdir '-d' or die 'Could not rmdir.';"
Thomas L Holaday
la source
8

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

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

Si votre fichier que vous essayez de supprimer comprend astérisques ou des barres obliques, ne pas pomper accidentellement un .ou /*ou *ou un autre caractère générique qui pourrait cascade supprimer 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:

Puis passez l’option -delete à rechercher, pour les supprimer:

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

Aaaannd c'est parti.

Eric Leschinski
la source
2

Midnight Commander ( mc) est le plus facile, il suffit de pointer dessus et d'appuyer sur F8;)

Marcin
la source
3
L'OP souhaite une solution de ligne de commande (CLI).
Francesco Turco
1
Midnight Commander EST une solution CLI. Utilisez simplement votre gestionnaire de paquets pour l'installer. (Cela fonctionne même sur ssh ...) fr.wikipedia.org/wiki/MnightnightCommander
daviewales
6
En quoi apt-get install mc || yum install mc; mc différentes touches fléchées et F8 sont-elles plus faciles que rm ./--help?
Josh
3
@daviewales: Midnight Commander est démarré à partir de la ligne de commande et s'exécute dans le terminal, mais toutes les actions au clavier de Midnight Commander ne proviennent pas de la CLI (interface de ligne de commande) - mais de l'interface de Midnight Commander. - En règle générale, les utilitaires de ligne de commande peuvent être exécutés dans un script (à l'exception de l'historique de ligne de commande bash)
Peter.O
1

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

vim .

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

atti
la source
0

Avez-vous essayé d'ajouter le nom du répertoire comme 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 aide en général à éviter l'interprétation erronée du caractère "moins" comme option de commande par la fonction d'analyse.

Paulo Henrique Lellis Gonalves
la source
1
Je crois que cela a déjà été couvert dans une réponse précédente .
Kusalananda
-3

Si vous voulez renommer le fichier -.bar,, (mv ne fonctionnera pas), essayez ceci:

cat >foo.bar <-.bar

avant d'utiliser la commande:

rm -- -.bar

Vous devriez pouvoir examiner le contenu du fichier original dans foo.bar

Stephen Menasian
la source
4
Faire une copie du fichier n’est pas une solution très efficace pour le renommer.
Jw013
1
Vous pouvez utiliser vidir; mais c'est probablement aussi (ou même plus) inefficace - et beaucoup plus dangereux.
Stephen Menasian