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?


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 ..

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"



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.


1
rm -fr ./-A

Der obige Befehl funktioniert bei mir.


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$

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

-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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.