Lösung 1:
Eine Möglichkeit wäre mit sed:
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
Ersetzen Sie file
mit Ihrem Dateinamen natürlich. Dadurch wird alles, was kein Buchstabe, Zahl, Punkt, Unterstrich oder Bindestrich ist, durch einen Unterstrich ersetzt. Sie können nach Belieben Zeichen hinzufügen oder entfernen und/oder das Ersatzzeichen durch etwas anderes oder gar nichts ersetzen.
Lösung 2:
Ich nehme an, Sie sind auf einer Linux-Box und die Dateien wurden auf einer Windows-Box erstellt. Linux verwendet UTF-8 als Zeichenkodierung für Dateinamen, während Windows etwas anderes verwendet. Ich denke, das ist die Ursache des Problems.
Ich würde "convmv" verwenden. Dies ist ein Tool, das Dateinamen von einer Zeichenkodierung in eine andere umwandeln kann. Für Westeuropa funktioniert normalerweise eines davon:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
Wenn Sie es auf einem Debian-basierten Linux installieren müssen, können Sie dies tun, indem Sie Folgendes ausführen:
sudo apt-get install convmv
Es funktioniert jedes Mal für mich und stellt den ursprünglichen Dateinamen wieder her.
Quelle:LeaseWebLabs
Lösung 3:
Ich hatte einige japanische Dateien mit defekten Dateinamen, die von einem defekten USB-Stick wiederhergestellt wurden, und die oben genannten Lösungen haben bei mir nicht funktioniert.
Ich empfehle das Detox-Paket:
Das Detox-Dienstprogramm benennt Dateien um, um die Arbeit mit ihnen zu erleichtern. Es entfernt Leerzeichen und andere solche Belästigungen. Es übersetzt oder bereinigt auch Latin-1 (ISO 8859-1)-Zeichen, die in 8-Bit-ASCII codiert sind, Unicode-Zeichen, die in UTF-8 codiert sind, und CGI-escaped-Zeichen.
Beispielverwendung:
detox -r -v /path/to/your/files
-r Recurse into subdirectories -v Be verbose about which files are being renamed -n Can be used for a dry run (only show what would be changed)
Lösung 4:
Ich nehme an, Sie meinen, Sie wollen das Dateisystem durchlaufen und alle diese Dateien reparieren?
So würde ich es machen
find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
print("Renaming $_ to $new\n"); rename($_, $new);
}'
Das würde alle Dateien mit Nicht-ASCII-Zeichen finden und diese Zeichen durch Unterstriche ersetzen (_
). Seien Sie jedoch vorsichtig, wenn eine Datei mit dem neuen Namen bereits vorhanden ist, wird sie überschrieben. Das Skript kann modifiziert werden, um nach einem solchen Fall zu suchen, aber ich habe das nicht eingefügt, um es einfach zu halten.
Lösung 5:
Folgen Sie den Antworten unter https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, Sie können verwenden:
rename 's/[^\x00-\x7F]//g' *
wobei *
entspricht den Dateien, die Sie umbenennen möchten. Wenn Sie dies über mehrere Verzeichnisse hinweg tun möchten, können Sie Folgendes tun:
find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;
Sie können das Argument -n für rename
verwenden um einen Probelauf zu machen und zu sehen, was geändert würde, ohne es zu ändern.