Ich habe Dateien mit ungültigen Zeichen wie diesen
009_-_�%86ndringshåndtering.html
Hier ist Æ
etwas im Dateinamen schief gelaufen.
Gibt es eine Möglichkeit, alle ungültigen Zeichen zu entfernen?
oder könnte tr
das irgendwie genutzt werden?
echo "009_-_�%86ndringshåndtering.html" | tr ???
Antworten:
Ein Weg wäre mit sed:
Ersetzen
file
Sie sie natürlich durch Ihren Dateinamen. Dies ersetzt alles, was kein Buchstabe, Ziffer, Punkt, Unterstrich oder Bindestrich ist, durch einen Unterstrich. Sie können Zeichen hinzufügen oder entfernen, um sie beizubehalten, und / oder das Ersatzzeichen in etwas anderes oder gar nichts zu ändern.quelle
f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_}
Ich gehe davon aus, dass Sie auf einer Linux-Box sind und die Dateien auf einer Windows-Box erstellt wurden. 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 konvertieren kann. Für Westeuropa funktioniert normalerweise eines der folgenden Verfahren:
Wenn Sie es auf einem Debian-basierten Linux installieren müssen, können Sie dies tun, indem Sie Folgendes ausführen:
Es funktioniert bei mir jedes Mal und stellt den ursprünglichen Dateinamen wieder her.
Quelle: LeaseWebLabs
quelle
Save the current file in Word 97-2004 format\sco.workflow
, das auf meinem Mac erstellt wurde (über Microsoft Office), und die obigen Codierungen haben keine Auswirkung.--notest
die Dateien umzubenennen.Ich nehme an, Sie meinen, Sie möchten das Dateisystem durchqueren und alle diese Dateien reparieren?
So würde ich es machen
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 geändert werden, um nach einem solchen Fall zu suchen, aber ich habe das nicht eingefügt, um es einfach zu halten.quelle
Die folgenden Antworten finden Sie unter https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters . Sie können Folgendes verwenden:
wo
*
passt zu den Dateien, die Sie umbenennen möchten. Wenn Sie es über mehrere Verzeichnisse tun möchten, können Sie Folgendes tun:Mit dem Argument -n können
rename
Sie einen Probelauf durchführen und sehen, was geändert wird, ohne es zu ändern.quelle
Ich hatte einige japanische Dateien mit kaputten Dateinamen von einem kaputten USB-Stick wiederhergestellt und die oben genannten Lösungen funktionierten nicht für mich.
Ich empfehle das Detox-Paket:
Anwendungsbeispiel:
quelle
detox
das Rad anzuschauen, bevor er es grundlegend neu erfindet. Wenn Sie sich die Manpage ansehen, werden Sie feststellen, dass sie aufgrund ihrer Flexibilität alle anderen hier vorgeschlagenen Lösungen abdeckt.的节奏啊
, aber diese Zeichen sind gültige Dateinamen.Dieses Shell-Skript bereinigt ein Verzeichnis rekursiv, um Dateien zwischen Linux / Windows und FAT / NTFS / exFAT portierbar zu machen. Es entfernt Steuerzeichen
/:*?"<>\|
und einige reservierte Windows-Namen wieCOM0
.Linux ist theoretisch weniger restriktiv (
/
und\0
in Dateinamen strengstens verboten), in der Praxis stören jedoch mehrere Zeichen Bash-Befehle (wie*
...), weshalb sie auch in Dateinamen vermieden werden sollten.Gute Quellen für Einschränkungen bei der Benennung von Dateien:
quelle
Wenn Sie eingebettete Zeilenumbrüche, Multibyte-Zeichen, Leerzeichen, führende Bindestriche, umgekehrte Schrägstriche und Leerzeichen verarbeiten möchten, benötigen Sie etwas Robusteres. Lesen Sie dazu die Antwort:
https://superuser.com/a/858671/365691
Ich stelle das Skript bei Interesse auf code.google.com ein: rnf-bash-rename-script
quelle
Ich verwende diesen Einzeiler, um ungültige Zeichen in Untertiteldateien zu entfernen:
quelle
für Datei in *; do mv "$ file" $ (echo "$ file" | sed -es / [^ A-Za-z0-9. -] / / g '); getan &
quelle