GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie entferne ich ungültige Zeichen aus Dateinamen?

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.


Linux
  1. Wie entferne ich die Zeilen, die in Datei B erscheinen, aus einer anderen Datei A?

  2. Entfernen Sie Leerzeichen aus Dateinamen in Linux

  3. Wie entferne ich ISO 9660 von USB?

  4. Wie kann man Dateien mit ungültiger Codierung massenhaft umbenennen oder ungültig codierte Zeichen massenweise ersetzen?

  5. Wie entferne ich nachgestellte Zeichen in Dateinamen in Bash?

So entfernen Sie einen Befehl aus dem Verlauf in Linux

So entfernen Sie (^M) Zeichen aus einer Datei in Linux

So entfernen Sie Leerzeichen aus Dateinamen in Linux

So entfernen Sie alle Leerzeichen aus einer Textdatei

Wie entferne ich Swap Space von Centos 7.x?

Wie entferne ich Zonendateien von meinem Server?