
Aufgrund eines Softwarefehlers gibt es in meinem Linux-System ein Verzeichnis mit Junk-Namen, wie Sie unten sehen können. Ich habe Probleme, sie zu löschen.
$ ll
total 1532
drwxr-xr-x 2 sensage sensage 4096 Apr 19 16:56 -?$??
drwxrwxr-x 248 sensage sensage 4096 Apr 23 11:37 .
drwxrwxr-x 99 sensage sensage 4096 Apr 16 14:23 ..
drwxr-xr-x 2 sensage sensage 4096 Apr 6 14:54 }???;?
drwxr-xr-x 2 sensage sensage 4096 Apr 19 03:01 }??=?|
-rw-r--r-- 1 sensage sensage 88 Apr 22 13:37 $
drwxr-xr-x 2 sensage sensage 4096 Apr 2 12:43 ?
drwxr-xr-x 2 sensage sensage 4096 Mar 20 02:51 ?=??&?
drwxr-xr-x 2 sensage sensage 4096 Apr 11 08:40 ?;%??;
drwxr-xr-x 2 sensage sensage 4096 Apr 14 09:38 ?:????
drwxr-xr-x 2 sensage sensage 4096 Mar 22 17:21 ?(?>~?
drwxr-xr-x 2 sensage sensage 4096 Apr 1 13:45 ?[???%
drwxr-xr-x 2 sensage sensage 4096 Apr 3 14:03 ?@????
drwxr-xr-x 2 sensage sensage 4096 Apr 12 16:18 ??
drwxr-xr-x 2 sensage sensage 4096 Apr 17 16:38 ??&???
drwxr-xr-x 2 sensage sensage 4096 Mar 25 02:43 ??+???
drwxr-xr-x 2 sensage sensage 4096 Apr 19 00:46 Ü¡?,??
drwxr-xr-x 2 sensage sensage 4096 Mar 28 18:54 ÚŸ??"?
drwxr-xr-x 2 sensage sensage 4096 Mar 27 01:04 ???(?
drwxr-xr-x 2 sensage sensage 4096 Apr 19 22:41 ??ͨ?`
drwxr-xr-x 2 sensage sensage 4096 Apr 15 11:44 ?????-
Wie Sie sehen können, sind die Verzeichnisnamen blau. Wenn ich sie löschen möchte, erhalte ich die folgende Fehlermeldung:
$ ls -1 | grep -v 20 | xargs rm -rf
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
rm: invalid option -- ¼
Try `rm ./'-¼$Þ¸Í'' to remove the file `-\274$\336\270\315'.
Try `rm --help' for more information.
was soll ich mit ihnen machen?
Antwort1
ls
druckt Nicht-ASCII-Zeichen (oder vielmehr Zeichen, die in der aktuellen Locale nicht unterstützt werden) als ?
. Dies ist einer der Gründe, warum ls
es nicht sinnvoll ist, die Ausgabe von zu parsen. Die Ausgabe von ls
sollbetrachtete. In einigen Fällen, wie diesem, sind dies nicht die tatsächlichen Namen, die im Dateisystem vorhanden sind.
Versuchen Sie stattdessen etwas wie (diese werden löschenalleDateien und Verzeichnisse, einschließlich /path/to/dir
)
rm -rf /path/to/dir
oder
find /path/to/dir -delete
oder
find /path/to/dir -exec rm -rf {} +
oder
find /path/to/dir -print0 | xargs -0 rm -rf
Passen Sie es Ihren Bedürfnissen an. Um nur Dateien zu löschen, fügen Sie in den Beispielen beispielsweise -type f
nach dem Pfad hinzu:find
Nur tunrm -rf *
in diesem Verzeichnis(das istwichtig, das aktuelle Arbeitsverzeichnis muss das Verzeichnis sein, dessen Dateien und Verzeichnisse Sie löschen möchten) kann auch ausreichend sein.
Siehe auchWarumnichtanalysieren ls
?
Antwort2
Eine alternative Methode zum einfachen Entfernen von Verzeichnissen und/oder Dateien, deren Namen nicht druckbare Zeichen enthalten, besteht darin, die Inode-Nummer der fehlerhaften Verzeichnisse (oder Dateien) zu ermitteln und das Verzeichnis (oder die Datei) mithilfe dieser Nummer zu löschen:
cd /mypath || exit 1
ls -il #...to show the inode <number> in the leftmost column output
find . -xdev -inum <number> -exec rm -rf {} +
Die -xdev
Option stellt sicher, dass find
keine Verzeichnisse auf anderen Dateisystemen absteigen. Inode-Nummern sind nur innerhalb eines Dateisystems garantiert eindeutig.
Fügen Sie „-f“ als zusätzliche find
Option hinzu, um nur Dateien zurückzugeben.