Löschen eines UNIX-Verzeichnisses mit einem Bindestrich im Namen

13

Durch ein bloßes Manöver meinerseits habe ich versehentlich ein Verzeichnis mit dem Namen (zum Beispiel) -A erstellt und es schließlich mit Dateien gefüllt.

Ich möchte das besagte Verzeichnis löschen. Ich habe es versucht:

rmdir -- -A

aber es sagt mir dann, dass das Verzeichnis noch Dateien enthält. Und ich kann nicht herausfinden, wie man in das Verzeichnis cd, um besagte Akten zu löschen.

Was soll ich tun, um dieses störende Verzeichnis loszuwerden?

Kate Bertelsen
quelle
5
Zum Glück wurde das Verzeichnis nicht '-rf *' genannt.
user1686
Gleiches gilt für Stackoverflow und Unix .
Dorian

Antworten:

29

Verwenden Sie - bei jedem Befehl.

$ 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 ..
Muhen
quelle
11

Sie können ./ vor die Datei stellen - auf diese Weise verhält sich rm oder rmdir nicht so, als wäre der Dateiname ein Optionsflag.

Sie können auch die Option ausgeben, mit der rm so verhält, als ob alles nach dem Dateinamen steht und keine weiteren Optionen verarbeitet werden sollen. Es mag funky ältere Versionen von rm geben, die das nicht befolgen, obwohl mein Zoo mit antiken Unixen heutzutage ziemlich klein geworden ist, so dass ich Ihnen nicht sagen kann, welche oder ob es Versionen gibt, die nicht verstehen -.

Sie sollten es sich zur Gewohnheit machen, beim Löschen die ./ vor Namen zu setzen - Sie wissen nie, ob sich in Ihrem Verzeichnis eine Datei mit dem Namen -r oder -rf befindet. Sie könnten sagen, dass Sie immer das verwenden sollten - aber ich finde, dass das ./ natürlicher ist, weil es explizit macht, dass "Ich möchte Dateien in diesem Verzeichnis löschen, nicht, was auch immer * mit glob out passiert"

chris
quelle
4

Benenne es um und behandle es dann normal:

$ mv -- -A foo
$ find foo
$ rm -rf foo
David Mackintosh
quelle
2

rmdir löscht kein Verzeichnis, in dem sich etwas befindet. "rm -rf" wird. rmdir ist wesentlich sicherer als "rm -rf". Moos Antwort ist wahrscheinlich immer noch die beste.

David Pashley
quelle
1
rm -fr ./-A

Der obige Befehl funktioniert bei mir.

q0987
quelle
0

Eine andere Methode wäre das Löschen per Inode (dies funktioniert für Dateien / Verzeichnisse mit anderen Zeichen, die nur mit rm schwer zu löschen sind).

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
quelle
Der rm wird weiterhin ein -A-Argument in der Befehlszeile übergeben und versucht, es als Option zu interpretieren. Sie müssen also weiterhin verhindern, dass der führende Gedankenstrich angezeigt wird (durch doppelte Bindestriche oder durch Setzen von ./ vor dem Rest des Namens
Chris
Der Suchvorgang wird dem automatisch vorangestellt, da Sie nach "." Suchen. Der übergebene Dateiname lautet './-A' oder wie auch immer die Datei heißen mag, mit vorangestelltem ./ und ordnungsgemäß für den Befehl maskiert.
Baumgart
Nit: -execentgeht dem Namen nicht und muss es nicht; Das über einen der exec*Systemaufrufe übergebene Argument ist der tatsächliche Name. Es ist nur die Shell- Eingabe, für die spezielle Zeichen wie ein Semikolon-Sternchen usw. erforderlich sind, damit die Shell den korrekten tatsächlichen Namen (OHNE Anführungszeichen) übergibt. Das heißt, es find -exec rm -f {}funktioniert nur für eine Datei, nicht für ein Verzeichnis, das nach diesem Q gefragt wurde. find -exec rm -rf {}behandelt Verzeichnisse und sogar nicht leere Verzeichnisse, aber überspringen findund nur tun rm -rf ./-Aist viel einfacher.
Dave_thompson_085
0

find kann das Verzeichnis folgendermaßen löschen:

find . -type d -iname '-A' -delete
ThorstenS
quelle
-1

Ich habe versucht, ein Verzeichnis mit dem Namen zu löschen -p. @Moos Antwort erreichte das, was ich nicht konnte rm ./-p, was nach einer Google-Suche auf vielen Webseiten allgemein verfügbar ist.

Eine andere Methode ist die Verwendung der Inode-Nummer. Ich habe die hier beschriebene Methode angewendet:

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

Kurz gesagt, verwenden Sie die folgenden Befehle:

  1. Anzeige der Datei- oder Verzeichnis-Inode-Nummer.
ls -il
  1. Verwenden Sie den findBefehl mit dem -exec rm -irfArgument für eine Datei oder -exec rm -ifdrein Verzeichnis.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Stellen Sie sicher, dass Sie die -fOption innerhalb des Flags verwenden. Andernfalls beschwert sich bash, dass das Verzeichnis oder die Datei nicht gefunden werden kann.

Getestet am:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
Andres Salgado
quelle
1
Dies wird Duplikat fast der Antwort des baumgart von vor 10 Jahren, aber Sie brauchen nicht rm -dimmer und in der Regel nicht , -fwenn sie von Aufrufen find, aber Sie müssen -rfür ein Verzeichnis und nicht brauchen es für eine Datei. Selbst wenn korrigiert, ist diese Methode immer noch ungeschickt und minderwertig. Für ein nicht leeres Verzeichnis einfach tun rm -fr ./-p- das ist r für ein Verzeichnis und f abhängig von den Berechtigungseinstellungen.
Dave_thompson_085
1
Beide Methoden wurden bereits in früheren Antworten erwähnt.
RalfFriedl