Dateien mit Sonderzeichen im Dateinamen können nicht gelöscht / verschoben werden

17

Wie Sie unten sehen können, haben die Dateien ungewöhnliche Zeichen.

Datei-Manager Screenshot

Wenn Sie sie entweder im Terminal oder in Dolphin löschen, wird der Fehler zurückgegeben:

Datei oder Verzeichnis existiert nicht

Das Laufen ls -laauf dem Verzeichnis gab mir diese Ausgabe:

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

Ich habe einen fsckBefehl auf der Partition von einem anderen Betriebssystem ausgeführt, aber es hat sich nichts geändert.

Wie entferne ich diese Dateien?

karjedavpalaa
quelle
1
Haben Sie auf Ihrem System ein verschlüsseltes Basisverzeichnis eingerichtet?
Dobey
@dobey habe ich nicht.
Karjedavpalaa
5
@Panther Sie irren sich. Dies ist nicht an mich ein Hinweis auf einem korrupten Dateisystem, und selbst wenn es wurde von Datenkorruption irgendeine Art verursacht, fsck wird nichts über es nicht tun.
zwol
1
Ich habe Dateien mit unbekannten Zeichen im Namen gehabt. Das Umbenennen der Dateien hat funktioniert. dann könnten sie gelöscht werden.
Ravery

Antworten:

35

Ein einfacher Weg wäre, diese Dateien durch ihren Inode zu entfernen. :)

Verwenden Sie ls -liin dem Verzeichnis mit den ungewöhnlichen Zeichen, um die Inode-Nummer jeder Datei anzuzeigen, z.

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Verwenden Sie als Nächstes das findDienstprogramm, um die entsprechende Datei anhand ihres Namens zu löschen. Verwenden Sie dazu die folgende Syntax find <somepath> -inum <inode_number> -exec rm -i {} \;:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Die -iOption zu rmist nicht wirklich notwendig, ich habe sie nur hinzugefügt, um zu verhindern, dass Sie versehentlich Dateien entfernen, die Sie nicht entfernen wollten. :) rmFür jede Datei, die Sie löschen möchten, werden Sie um Bestätigung gebeten.

Wenn Sie mehrere Dateien nach ihren Inodes entfernen möchten, können Sie die -o(Bedeutungs- oder ) Syntax für Folgendes verwenden find:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

Sie können weitere Inode-Nummern hinzufügen, indem Sie den Ausdruck in Klammern um weitere -o -inum <inode_number>Ausdrücke erweitern.

Malte Skoruppa
quelle
4
Wie wäre es rm -ri .?
Brent Baccala
Das hat funktioniert: find <somepath> -inum <inode_number> -exec rm -i {} \; Was tun '-inum', '{}' und '\' im Befehl?
Karjedavpalaa
Wie entferne ich mehrere Dateien auf einmal? Auch danke, du hast meinen Tag gemacht!
Karjedavpalaa
2
@BrentBaccala rm -ri .löscht Dateien jedoch nicht nach Inode. Es durchsucht einfach das gesamte Arbeitsverzeichnis und fragt nach jeder Datei, ob Sie sie entfernen möchten - und Sie müssen sehr aufmerksam sein, nach welchen Dateien es suchen soll, um nicht versehentlich unerwünschte Dateien zu entfernen. Ich würde diesen Befehl auf keinen Fall für mein Home-Verzeichnis verwenden wollen - es enthält VIELE Dateien. ;)
Malte Skoruppa
3
@karjedavpalaa (1) -inumweist findan, nach Dateien anhand ihrer Inode-Nummer zu suchen. (2) {}stimmt mit den Dateien überein, die von gefunden wurden grep. (3) \ entgeht dem ;Symbol, das den an die -execOption von übergebenen Befehl beendet find. (4) Ich habe meine Antwort bearbeitet, um zu erklären, wie mehrere Dateien auf einmal entfernt werden.
Malte Skoruppa
13

Es ist wichtig zu verstehen, dass dies nicht die Art von "Dateisystembeschädigung" ist, fsckdie dabei hilft. Für das Dateisystem können Dateinamen eine beliebige Folge von Bytes sein , sofern kein einzelnes Byte den Wert 0x00 (ASCII-NUL, C-Zeichenfolgenendemarker) oder 0x2F ( /das Verzeichnistrennzeichen) hat. (Wenn ein Dateiname irgendwie ein 00- oder 2F-Byte enthält, fscksollte dies behoben werden.)

Sie haben vielmehr Dateinamen, von denen die Anwendungssoftware (Dolphin ls) annimmt, dass sie Zeichen enthalten, die in Ihrem Gebietsschema nicht angezeigt werden können. Daher werden diese durch Platzhalterzeichen ersetzt. Sie können nicht geben Sie die Zeichen entweder, so dass die Dateien zu manipulieren schwieriger ist, aber man kann es so lange tun , wie Sie es , ohne jemals Typisierung zu tun oder zu kopieren und den Namen einfügen. Wenn Sie beispielsweise die Problemdateien direkt in Dolphin löschen oder umbenennen, sollte dies einfach funktionieren (ich würde sogar sagen, dass dies ein Fehler in Dolphin ist, wenn es nicht funktioniert).

Wenn Sie in der Shell etwas dagegen unternehmen müssen (z. B. wenn sie Eigentum rooteines GUI-Programms sind und daher nicht von einem GUI-Programm geändert werden können), können Sie sie indirekt mit "glob" -Mustern benennen, die in der richtigen Reihenfolge erweitert werden (s) von Bytes und weitergegeben.

Jetzt möchten Sie natürlich nicht versehentlich Daten löschen, da Ihr Glob-Muster zu stark übereinstimmt. Daher empfehle ich, das Perl- renameDienstprogramm zu verwenden, um jeden Dateinamen in seine Hex-Codierung zu konvertieren:

$ rename '$_ = unpack("H*", $_)' *

Hierdurch werden keine Informationen zerstört - weder die Datei selbst noch die Bedeutung, die ursprünglich im Dateinamen enthalten war, bevor er beschädigt wurde. Es kann für bestimmte Dateien mit zB rückgängig gemacht werden

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

Achtung: Es gibt zwei Programme renameunterschiedlicher Herkunft. Die oben genannten Befehle funktionieren nur mit denen, die mit Perl erstellt wurden. In Ubuntu ist das, was Sie wollen, das aus dem "Rename" -Paket, nicht das aus dem "Util-Linux" -Paket. rename -hwird unterscheiden: das ist, was Sie wollen ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... das ist nicht was du willst ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

Der Schlüssel zu suchen ist "perlexpr". Möglicherweise haben Sie eine ältere Version des Perl-Umbenennungsprogramms, die nicht alle oben genannten Optionen versteht. Der angezeigte Befehl sollte jedoch weiterhin funktionieren.

Edit: Unter 14.04 .5 unterstützt das enthaltene Perl-Skript renameden -h-Schalter nicht. Sie können bestätigen, dass Sie die richtige haben, indem Sie die Manpage überprüfen. man renameIn diesem Fall enthält die oberste Zeile Folgendes:

RENAME (1) Perl-Programmierer-Referenzhandbuch RENAME (1)

zwol
quelle
--version umbenennen Unbekannte Option: version
Elder Geek
@ElderGeek Was wird file $(which rename)gedruckt? ( file
Stellen
/usr/bin/rename: symbolic link to /etc/alternatives/rename( fileist standardmäßig installiert) Eigentlich muss man die symbolischen Links jagen, um zu bekommen /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable , man renameist aber eine schnellere Anzeige ...
Elder Geek
@ElderGeek Wenn es sich um ein Perl-Skript handelt, handelt es sich wahrscheinlich um eine ältere Version des mit Perl erstellten Skripts, die nicht unterstützt wird --version. Der Befehl, den ich vorgeschlagen habe, sollte immer noch funktionieren. (/usr/share/doc/rename/changelog.gz auf meinem Computer, auf dem Debian unstable ausgeführt wird, zeigt an, dass --versiones 2013 in Version 0.10 des Perl-Umbenennens hinzugefügt wurde. Ich bin überrascht, dass Ubuntu immer noch etwas älteres als dieses ausliefert. aber dieses Programm hat seine Funktionalität seit 2007 (!) nicht wirklich geändert, also ist es in Ordnung.)
zwol
Ah! Das erklärt die Verwirrung. Trotz vieler gegenteiliger Behauptungen ist Debian kein Ubuntu. Ich kann nicht für jede Version sprechen, aber einige derzeit unterstützte Versionen von Ubuntu LTS (14.04) haben das noch nicht. (Obwohl 16.04 tut)
Elder Geek