Suppression d'un répertoire UNIX avec un trait d'union dans le nom

13

Grâce à une manœuvre audacieuse de ma part, j'ai accidentellement créé un répertoire appelé (par exemple) -A, et j'ai fini par le remplir de fichiers.

Je souhaite supprimer ledit répertoire. J'ai essayé:

rmdir -- -A

mais il me dit alors que le répertoire contient toujours des fichiers. Et je ne peux pas comprendre comment cd dans le répertoire pour supprimer lesdits fichiers.

Que dois-je faire pour me débarrasser de ce répertoire gênant?

Kate Bertelsen
la source
5
Heureusement, le répertoire ne s'appelait pas '-rf *'.
user1686
Idem sur stackoverflow et unix .
Dorian

Réponses:

29

Utilisez - sur chaque commande.

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
Meuglement
la source
11

Vous pouvez mettre ./ devant le fichier - de cette façon, rm ou rmdir ne se comportera pas comme si le nom de fichier était un indicateur d'option.

Vous pouvez également émettre l'option - qui indique à rm d'agir comme si tout ce qui se trouvait après le - est un nom de fichier et qu'il ne devrait plus traiter d'options. Il peut y avoir des versions plus anciennes et funky de rm qui n'obéissent pas à cela, bien que mon zoo d'Unixes antiques soit devenu assez petit ces jours-ci, donc je ne peux pas vous dire lesquels ou s'il existe des versions qui ne comprennent pas -.

Vous devriez prendre l'habitude de mettre le ./ devant les noms quand vous supprimez de toute façon - vous ne savez jamais s'il y a un fichier nommé -r ou -rf dans votre répertoire. Vous pourriez dire que vous devriez toujours utiliser le - mais je trouve que le ./ est plus naturel car il rend explicite que "je veux supprimer les fichiers dans ce répertoire, pas quoi que * passe par glob à"

chris
la source
4

Renommez-le et traitez-le normalement:

$ mv -- -A foo
$ find foo
$ rm -rf foo
David Mackintosh
la source
2

rmdir ne supprimera pas un répertoire contenant quoi que ce soit à l'intérieur. "rm -rf" le fera. rmdir est considérablement plus sûr que "rm -rf". La réponse de Moo est probablement la meilleure.

David Pashley
la source
1
rm -fr ./-A

La commande ci-dessus fonctionne pour moi.

q0987
la source
0

Une méthode différente serait de supprimer par inode (cela fonctionne pour les fichiers / répertoires avec d'autres caractères qui sont difficiles à supprimer avec juste rm).

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$
baumgart
la source
le rm recevra toujours un argument -A sur la ligne de commande et essaiera toujours de l'interpréter comme une option, vous devez donc toujours l'empêcher de voir le tiret de tête d'une manière ou d'une autre (par le biais de doubles tirets ou en plaçant ./ devant le reste du nom.
chris
La recherche l'ajoutera automatiquement, puisque vous recherchez à partir de '.'. Le nom de fichier transmis sera './-A', ou quel que soit le nom du fichier, précédé de ./ et correctement échappé pour la commande.
baumgart le
Nit: -execn'échappe pas au nom et n'a pas besoin de le faire; l'argument transmis via l'un des exec*appels système est le nom réel. Ce n'est que l' entrée du shell qui a besoin de caractères spéciaux comme un astérisque point-virgule, etc. entre guillemets pour que le shell passe le nom réel correct (SANS guillemets). Cela dit, find -exec rm -f {}ne fonctionne que pour un fichier, pas un répertoire comme demandé pour ce Q; find -exec rm -rf {}gère le répertoire et même le répertoire non vide, mais sauter findet simplement faire rm -rf ./-Aest beaucoup plus simple.
dave_thompson_085
0

find peut supprimer le répertoire de cette façon:

find . -type d -iname '-A' -delete
ThorstenS
la source
-1

J'essayais de supprimer un répertoire nommé -p. La réponse de @ Moo a atteint ce que je n'ai pas pu faire rm ./-p, qui est largement disponible sur de nombreuses pages Web après une recherche Google.

Une autre méthode consiste à utiliser le numéro d'inode. J'ai utilisé la méthode décrite ici:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

En bref, utilisez les commandes suivantes:

  1. Pour afficher le numéro d'inode du fichier ou du répertoire.
ls -il
  1. Utilisez la findcommande en utilisant l' -exec rm -irfargument d'un fichier ou -exec rm -ifdrd'un répertoire.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Assurez-vous d'utiliser le -fdans l'indicateur, sinon bash se plaindra de ne pas pouvoir trouver le répertoire ou le fichier.

Testé sur:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
Andres Salgado
la source
1
C'est presque le double de la réponse de baumgart d'il y a 10 ans, mais vous n'avez rm -djamais besoin et généralement pas -flors de l'appel depuis find, mais vous avez besoin -rd'un répertoire et vous n'en avez pas besoin pour un fichier. Même corrigée, cette méthode est toujours maladroite et inférieure. Pour un répertoire non vide, faites-le rm -fr ./-p- c'est r pour un répertoire, et f selon les paramètres d'autorisation.
dave_thompson_085
1
Les deux méthodes ont déjà été mentionnées dans les réponses précédentes.
RalfFriedl