it-swarm.com.de

Wie entferne ich ungültige Zeichen aus Dateinamen?

Ich habe Dateien mit ungültigen Zeichen wie diesen

009_-_�%86ndringshåndtering.html

Es ist ein Æ wo im Dateinamen etwas schief gelaufen ist.

Gibt es eine Möglichkeit, einfach alle ungültigen Zeichen zu entfernen?

oder könnte tr irgendwie verwendet werden?

echo "009_-_�%86ndringshåndtering.html" | tr ???
50
Sandra

Ein Weg wäre mit sed:

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

Ersetzen Sie file natürlich durch Ihren Dateinamen. Dies ersetzt alles, was kein Buchstabe, keine Zahl, kein Punkt, kein Unterstrich oder kein Bindestrich ist, durch einen Unterstrich. Sie können Zeichen hinzufügen oder entfernen, um sie nach Belieben beizubehalten, und/oder das Ersatzzeichen in etwas anderes oder gar nichts ändern.

44

Ich gehe davon aus, dass Sie sich auf einer Linux-Box befinden und die Dateien auf einer Windows-Box erstellt wurden. Linux verwendet UTF-8 als Zeichencodierung 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, mit dem Dateinamen von einer Zeichenkodierung in eine andere konvertiert werden können. Für Westeuropa funktioniert eines davon normalerweise:

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

32
mevdschee

Ich hatte einige japanische Dateien mit defekten Dateinamen, die von einem defekten USB-Stick wiederhergestellt wurden, und die oben genannten Lösungen funktionierten bei mir nicht.

Ich empfehle das Detox-Paket:

Das Detox-Dienstprogramm benennt Dateien um, um die Arbeit mit ihnen zu vereinfachen. Es entfernt Räume und andere solche Belästigungen. Außerdem werden in 8-Bit-ASCII codierte Latin-1-Zeichen (ISO 8859-1), in UTF-8 codierte Unicode-Zeichen und CGI-Escape-Zeichen übersetzt oder bereinigt.

Anwendungsbeispiel:

detox -r -v /path/to/your/files
 - r In Unterverzeichnisse zurückgreifen 
 - v Geben Sie ausführlich an, welche Dateien umbenannt werden 
 - n Kann für einen Probelauf verwendet werden (nur anzeigen, was geändert werden würde) 
22
H. Hess

Ich nehme an, Sie meinen, Sie möchten 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 geändert werden, um nach einem solchen Fall zu suchen, aber ich habe das nicht eingegeben, um es einfach zu halten.

17
Patrick

Folgende Antworten finden Sie unter https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters , Sie können verwenden:

rename 's/[^\x00-\x7F]//g' *

wo * 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 durchzuführen und zu sehen, was geändert werden würde, ohne es zu ändern.

15
naught101

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 wie COM0.

sanitize() {
  shopt -s extglob;

  filename=$(basename "$1")
  directory=$(dirname "$1")

  filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')

  if (test "$filename" != "$filename_clean")
  then
    mv -v "$1" "$directory/$filename_clean"
  fi
}

export -f sanitize

sanitize_dir() {
  find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}

sanitize_dir '/path/to/somewhere'

Linux ist theoretisch weniger restriktiv (/ und \0 sind in Dateinamen strengstens verboten), aber in der Praxis stören mehrere Zeichen Bash-Befehle (wie *...) daher sollten sie auch in Dateinamen vermieden werden.

Gute Quellen für Einschränkungen bei der Benennung von Dateien:

5
KrisWebDev

Wenn Sie eingebettete Zeilenumbrüche, Multibyte-Zeichen, Leerzeichen, führende Bindestriche, Backslashes und Leerzeichen verarbeiten möchten, benötigen Sie etwas Robusteres. Lesen Sie diese Antwort:
https://superuser.com/a/858671/365691

Ich habe das Skript auf code.google.com veröffentlicht, wenn jemand interessiert ist: r-n-f-bash-rename-script

1
A.Danischewski

Ich benutze diesen Einzeiler, um ungültige Zeichen in Untertiteldateien zu entfernen:

for f in *.srt; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.-]/./g;s/\.\.\././g;s/\.\././g'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done
  1. Nur * .srt-Dateien verarbeiten (* kann anstelle von * .srt verwendet werden, um jede Datei zu verarbeiten)
  2. Entfernt alle anderen Zeichen außer den Buchstaben A-Za-z, den Zahlen 0-9, den Punkten "." Und den Strichen "-".
  3. Entfernt mögliche Doppel- oder Dreifachperioden
  4. Überprüft, ob der Dateiname geändert werden muss
  5. Wenn true, wird die Datei mit dem Befehl mv umbenannt und die mit dem Befehl echo vorgenommenen Änderungen ausgegeben

Es funktioniert, um Verzeichnisnamen von Filmen zu normalisieren:

for f in */; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.]/./g' -e 's/\.\.\././g' -e 's/\.\././g' -e 's/\.*$//'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done

Gleiche Schritte wie oben, aber ich habe einen weiteren sed-Befehl hinzugefügt, um einen Punkt am Ende des Verzeichnisses zu entfernen

X-Men Tage der zukünftigen Vergangenheit (2014) [1080p]
Geändert zu:
X-Men.Days.of.Future.Past.2014.1080p

1
Brian Kuepper