Comment puis-je supprimer un fichier dans Linux dont le nom ressemble à UNIQUEMENT un trait d'union, comme dans "-"

J'ai essayé

rm -- - rm "-" rm "\-" rm \- 

Gave Perl a tiré

 ~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `rm $junk`;' - rm: cannot remove `-': No such file or directory 

…et…

 ~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `mv $junk newfile.garbage`;' - mv: cannot stat `-': No such file or directory 

Toute aide serait très appréciée, les gens sages.

Cela a été posté dans les FAQ d'Usenet pour Unix, je vois que c'est dans les FAQ de GNU Core Utility . Il y avait au moins cinq méthodes différentes, mais cela fonctionne bien:

 $ rm ./- 

Si un nom de fichier contient des caractères non identifiables, utilisez:

 $ rm -i * 

Le drapeau -i demande confirmation pour chaque fichier s'il doit être supprimé ou non.

En supprimant un fichier dont le nom débute - est une FAQ, mais il semble que vous avez un problème différent.

Parmi les solutions que vous avez mentionnées dans la question:

 rm -- - 

Cela devrait fonctionner.

 rm "-" 

Ce n'est pas différent de rm - . Les guillemets sont dépouillés par le shell, et la commande rm voit le trait d'union unique comme argument. Les cotes sont utiles pour échapper aux métacaractères de la coque; Le trait d'union est spécial pour rm , pas sur le shell.

 rm "\-" 

Les guillemets échappent à la barre oblique inverse, ce qui tente de supprimer un fichier dont le nom comprend deux caractères, une barre oblique inverse et un trait d'union.

 rm \- 

C'est comme rm "-" , équivalent à rm - .

Comme il se produit, au moins avec la version GNU coreutils de rm , rm - supprime (ou tente d'enlever) un fichier dont le nom consiste simplement en un trait d'union. Si votre dossier avait ce nom, il en irait maintenant. Je conclus que votre fichier comporte un nom qui ne ressemble qu'à un trait d'union.

 ls | cat -A 

Devrait donner une idée de ce que l'on appelle vraiment.

Voici un script Perl que je viens de jeter ensemble qui vous invite à chaque fichier dans le répertoire actuel et demande s'il faut le supprimer. Offert sans garantie, mais je l'ai testé brièvement.

 #!/usr/bin/perl use strict; use warnings; $| = 1; opendir my $DIR, '.' or die ".: $!\n"; my @files = sort grep { -f $_ } readdir $DIR; closedir $DIR; foreach my $file (@files) { print "Remove $file? "; my $answer = scalar <>; if ($answer =~ /^[Yy]/) { unlink $file or warn "$file: $!\n"; } elsif ($answer =~ /^[Qq]/) { exit 0; } } 

EDIT : Une solution moins élaborée: si le nom du fichier est juste un caractère, alors rm ? Devrait l'enlever (avec d'autres fichiers de ce type).

Si vous voulez quelque chose de plus sûr …

Essayez d'utiliser une combinaison de ls et find (cela fonctionne pour tout fichier que vous avez la permission de supprimer)

Le paramètre '-i' vous donnera le numéro d'inode pour chaque entrée de répertoire ls -li

 27 ---------- 1 owner group 3981 Oct 11 04:42 ????? 

Une fois que vous avez le numéro d'inode …

 find . -inum **27** -exec rm -i {} \; 

Donnez à rm ./- un essai.

The - est un drapeau pour commencer un argument de drapeau. Si vous commencez l'argument avec n'importe quoi, sauf a - , dans ce cas / , il supposera que c'est le nom du fichier. C'est ce que vous souhaitez.

Et comme le file et ./file sont le même fichier, il ciblera le fichier nommé - via ./- .

Pas aussi geeky que la plupart des autres réponses, mais j'aimerais ouvrir une instance de mc , commandant de minuit, et simplement sélectionner et supprimer le fichier.

Essayer:

 $ ls -b 

Pour voir si le nom du fichier comporte des caractères non imprimables.

Non qu'il soit nécessaire d'utiliser Perl ici, mais cela devrait fonctionner:

 perl -e 'unlink "-"' 

Ou pour voir quelle erreur sur ce qui précède pourrait être:

 perl -e 'unlink "-" or die "Err: $!"' 

J'ai eu de la chance en utilisant Nautilus de GNOME pour supprimer des fichiers mal nommés. Utilisez-vous un serveur X? Je suis sûr que d'autres navigateurs de fichiers fonctionneront aussi.

Si

 rm -- - 

N'a pas fonctionné, le nom de fichier n'est pas "juste un trait d'union". Si aucun autre fichier ne comporte un trait d'union, vous pourriez essayer

 perl -E'for (@_) { if (/-/) { unlink($_) or die $! } }' -- * 

Jusqu'à présent, je reçois un "Aucun fichier ou répertoire" pour chaque méthode publiée jusqu'à présent:

 rm ./- rm -- - mv "-" test.txt rm -rf '-' <-- this gives no error, but doesn't work perl -e 'unlink "-";' <--also no error, doesn't work. 

Il semble que j'ai la version 7.4 de rm. Je vais essayer de mettre à niveau et de réessayer ces suggestions. Merci à tous d'avoir aidé.

Je suis très friands d'utiliser le mode dired emacs pour ce genre de chose – juste "ouvrir" le répertoire dans emacs. Vous pouvez facilement sélectionner des fichiers et les marquer pour supprimer.

Une autre affiche a suggéré d'utiliser le commandant de minuit; C'est à peu près la même idée, mais si vous êtes déjà un utilisateur Emac, c'est peut-être plus pratique.

Devrait être capable de faire rm -f '-' travaillé pour moi à cygwin

D'ailleurs, rm - semble aussi fonctionner sur chapeau rouge.