Ich habe eine beschädigte tar-Datei entpackt und es geschafft, ein Verzeichnis zu finden, das ich nicht löschen kann. Wenn ich versuche, es zu löschen, kann es anscheinend nicht gefunden werden, ls
zeigt aber , dass es sowohl mit Bash als auch mit Python vorhanden ist Ähnliches Verhalten, außer dass ich gleich nach dem Versuch, es mit zu löschen rm -rf
, ls
beschwere, dass es es nicht finden kann, und es es dann auflistet (siehe weiter unten rm -rf
). Der find
Befehl zeigt an, dass die Datei vorhanden ist, mir fällt jedoch keine Möglichkeit zum Löschen ein.
Hier sind meine Versuche:
Hier sehen Sie beide ls
und find
stimmen zu, dass wir ein Verzeichnis haben,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Ich kann es aber nicht löschen:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
Ich kann cd
es aber und es ist leer:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
siehe unten, das ist keine einfache Datei, sondern ein Verzeichnis. Außerdem ls
verhält es sich komisch, wenn rm -rf
es sagt, dass es die Datei nicht finden kann, und listet sie dann direkt danach auf:
rl]$ rm mikeaâ^Á^Äcnt/
rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory
rl]$ rm -rf mikeaâ^Á^Äcnt/
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
Das ist also der Versuch mit Python, die Datei wird gefunden, aber der Name kann nicht als Name verwendet werden, der gelöscht werden kann:
rl]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import shutil
>>> os.listdir('.')
['mikea\xc3\xa2\xc2\x81\xc2\x84cnt']
>>> shutil.rmtree(os.listdir('.')[0] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'
Selbst wenn ich die Tab-Vervollständigung verwende, ist der Name, den es aufnimmt, nicht verwendbar:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Unter Verwendung des Namens, den Python mit Bash anzeigt, erhalte ich Folgendes:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Kann ich irgendetwas tun, um dieses korrupte Verzeichnis loszuwerden? Das zugrunde liegende Dateisystem (NFS) scheint funktionsfähig zu sein, und es wurden keine weiteren Probleme gemeldet. Bis zur Beschädigung der tar-Datei hatte ich keine derartigen Probleme.
BEARBEITEN: Hier wird die find
eigene -exec
Option zum Anrufen verwendetrm
rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
aber die datei ist immer noch da ( ls
beschwert sich, dass sie nicht gefunden werden kann, zeigt sie dann aber trotzdem an)
2. EDIT:
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Das Verhalten ist noch unverändert, die Datei noch vorhanden
3. EDIT:
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Der Name scheint mehr zu bedeuten, als sich mikeaâcnt
die Ausgabe des Python-Versuchs mikea\xc3\xa2\xc2\x81\xc2\x84cnt
und den folgenden Screenshot anzusehen:
4. BEARBEITUNG: Dies ist der Versuch mit einem Platzhalter:
rl]$ echo *
mikeaâcnt
rl]$ echo mike*
mikeaâcnt
rl]$ rm -rf mike*
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
und mein Gebietsschema:
rl]$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
5. Änderung:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
aber auch das verhalten hat sich geändert, jetzt ls
und cd
mach das:
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt
mikeaâcnt: No such file or directory.
Dies geschah nach den Löschversuchen. Ich denke, es könnte sich um NFS-Probleme handeln, wie in einer der Antworten hier von vinc17 vorgeschlagen.
6. EDIT: Dies ist die Ausgabe von lsof
undls -a
rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Äcnt lsof: Statusfehler auf mikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: Keine solche Datei oder Verzeichnis
oben ist falsch, hier ist der richtige lsof
Aufruf: (rl ist das übergeordnete Verzeichnis)
rl]$ /usr/sbin/lsof | grep mike | grep rl
tcsh 11926 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14733 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14734 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14735 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14736 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
rl]$
rl]$ ls -a
ls: cannot access mikeaâcnt: No such file or directory
. .. mikeaâ??cnt
7. Bearbeiten: Verschieben funktioniert nicht, (ich habe es vor all dem versucht, aber ich habe die Ausgabe nicht gespeichert ), aber es hat das gleiche Problem wie ls
und rm
mit der Datei.
8. BEARBEITEN: Dies verwendet die Hex-Zeichen wie vorgeschlagen:
rl]$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt.
rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt'
rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
9. Edit: für den stat
Befehl:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Es scheint sogar wahrscheinlicher, dass bei der gesamten Ausgabe ein Fehler oder ein anderes NFS-Fehlverhalten vorliegt, wie in den Kommentaren vorgeschlagen.
Edit 10: Dies ist eine direkte Ausgabe in einer Liste, da sie so groß ist, die Ausgabe oder diese beiden Befehle:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Edit 11: Also vor dem oben genannten habe rmdir
ich gemerkt, dass ich cd
in das Verzeichnis konnte, aber nach dem rmdir
konnte ich nicht cd
wieder, ähnlich wie gestern. Die .
und ..
Dateien waren vorhanden:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Letzte Änderung: Ich habe einen lokalen Administrator gesehen, und es wurde behoben, indem ich mich beim Server selbst anmeldete und von dort aus löschte. Die Erklärung von ihnen ist, dass es ein Problem mit Zeichensätzen im Namen sein könnte, die unpassend sind.
find
Ausgabe an einen anderen Befehl weiterleiten , anstatt nur dessenexec
Option zu verwenden?mv
. Vielleicht kannst du es danach löschen. Alternativ können Sie versuchen, das Verzeichnis in eine tiefere Ordnerebene zu verschieben (möglicherweise mit einem Platzhalter) und dann den Ordner zu löschen, in den Sie es verschoben haben.Antworten:
Der folgende Auszug aus diesem Aufsatz erklärt möglicherweise, warum dieses Verzeichnis nicht gelöscht werden darf:
quelle
Eine Möglichkeit, solche Dateien / Verzeichnisse zu löschen, ist die Verwendung der Inode-Referenz.
So finden Sie die Inodes für Elemente im aktuellen Verzeichnis:
Um dies zu löschen:
quelle
?
als Inode-Referenz. Wie löscht man es dann?Sie sollten in der Befehlszeile keine Nicht-ASCII-Zeichen verwenden, da diese aus irgendeinem Grund nicht unbedingt dem Dateinamen entsprechen (Unicode bietet verschiedene Möglichkeiten, Buchstaben mit Akzenten auszudrücken). So etwas wie:
sollte funktionieren, da der Dateiname direkt von der Shell generiert wird. Stellen Sie jedoch sicher, dass es nur eine Übereinstimmung gibt (bestätigen Sie dies
echo mike*
zuerst).Wenn es
cd
funktioniert, gibt es keinen Grund, warumrm
oderls
sollte ich sagenNo such file or directory
, dass das Problem möglicherweise auf Dateisystemebene liegt.Hinweis: Verwenden Sie nicht,
ls
um festzustellen, ob ein Verzeichnis leer ist, sondernls -a
.Das Verzeichnis kann weiterhin von einem anderen Prozess verwendet werden (auch wenn es sich um den CWD eines Prozesses handelt). IMHO, deshalb "existiert" es immer noch, kann aber zu Fehlern führen, zB mit
ls
;lsof
Sie erhalten möglicherweise einige Informationen, aber mit NFS müssen Sie herausfinden, auf welchem Computer diese verwendet werden. Insbesondere bei NFS kann dies zu merkwürdigen Fehlern führen.ls -a
im übergeordneten Verzeichnis können.nfs*
in einigen Fällen Dateien / Verzeichnisse angezeigt werden.Wenn du bekommst:
Ich vermute, dass die Datei aufgrund von NFS-Caching und / oder aufgrund der Verwendung durch einen anderen Prozess, jedoch ohne zugehörige Informationen, noch in der Verzeichnistabelle vorhanden ist. Wenn
ls
versucht wird, Informationen über die Datei selbst abzurufen, wird ein Fehler ausgegeben, da die Datei selbst nicht mehr vorhanden ist (sie befindet sich nur in der Verzeichnistabelle), daher der angezeigte Fehler. Anschließend wirdls
der Dateiname ausgegeben, da er in der Verzeichnistabelle enthalten ist. Die Tatsache, dass Sie in einem Fall Fragezeichen haben, aber nicht in dem anderen Fall, ist auf einen Anzeigefehler vonls
IMHO zurückzuführen (unabhängig von Ihrem Problem).quelle
Ich habe persönlich anhand
find
der-exec
Richtlinie getestet :Der Ordner wurde korrekt erstellt und korrekt entfernt.
Wie von @Igeorget hervorgehoben , gibt es eine noch einfachere Methode, wenn Sie GNU haben
find
:Ich habe diesen Befehl auch getestet und er funktioniert ordnungsgemäß
quelle
-delete
Option.Ich glaube, ich hatte das gleiche Problem. Ich habe das Problem früher mit einem Dateinamen von gesehen
☃
.ls
In diesem Fall wurde die Datei als angezeigtâ??
, aber ich konnte sie mit löschenrm ☃
.Dies führte mich zu der folgenden Methode, um den falschen Namen in den richtigen Namen umzuwandeln:
Holen Sie sich zuerst die Bytes des Dateinamens:
Dekodieren Sie diese Bytes dann als UTF-8, um die Unicode-Codepunkte zu erhalten. Verwenden Sie dazu die hexadezimale Eingabe dieser Website, beispielsweise: http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder
Beachten Sie, dass diese alle unterhalb der Byte-Grenze liegen. Wir erhalten folgende Bytes:
Wenn wir diese Sequenz bei UTF-8 behandeln, erhalten wir:
Und so lautet Ihr Dateiname:,
mikea⁄cnt
mit einem Bruchstrich anstelle eines normalen Schrägstrichs. Sie können diesen Namen jetzt an übergebenrmdir
.quelle
Nachdem Sie den korrekten Hex-Code für den Datei- / Ordnernamen erhalten haben (mit welcher Methode auch immer, kann ich wählen
ls --show-control-chars | xxd
), sollten Sie ein spezielles Konstrukt verwenden, um solche Zeichen zu adressieren, wenn Sie unter bash ausgeführt werden:Ansonsten werden Backslashes wie Vanille-Backslashes behandelt.
quelle
ls
Zeilenvorschub in die Ausgabedaten einfließt und das "cnt" dupliziert wird. Vielleicht kannst du versuchen, die Zeile direkt in meine Antwort zu kopieren und einzufügen und zu prüfen, ob sie wirksam ist?LC_*
undLANG
env-Variablen) und NFS ohne Zeichensatzoptionen zu mountenHaben Sie versucht,
rm -rf ./mikeaâcnt
oderrm -rf "./mikeaâcnt"
oder einen absoluten Pfad zu verwenden?rm
Versuchen Sie es auch stattrmdir ./mikeaâcnt
.quelle
mikeaâcnt
nicht der Dateiname zu sein scheinen, sondern wasls
angezeigt wird, siehe die 3. BearbeitungHaben Sie versucht, die Inode dieser Datei zu erhalten mit
stat
:Das sollte dir die Inode-Nummer (und andere Daten) geben, und dann könntest du versuchen, sie zu löschen.
quelle
stat
verhalten,Ich hatte ähnliche Probleme. Haben Sie Gnome, KDE oder eine Art Xwindow DM? Wenn Sie Ihren File Broser öffnen und die Datei von dort entfernen.
Es sollte funktionieren.
Ich würde gerne eine Lösung von der Kommandozeile aus sehen, aber in meinem Fall und nachdem ich viel Zeit damit verbracht habe, herauszufinden, wie man sie von der Kommandozeile entfernt, stellte ich fest, dass es so einfach ist, wie jede andere Datei von nautilus oder zu entfernen jeder andere dateiexplorer (wahrheit ich habe es nur mit nautilus versucht).
quelle