Müssen Sie rekursiv alle Dateinamen suchen, die einen Doppelpunkt enthalten, und den Doppelpunkt durch einen Bindestrich ersetzen?

Müssen Sie rekursiv alle Dateinamen suchen, die einen Doppelpunkt enthalten, und den Doppelpunkt durch einen Bindestrich ersetzen?

Ich habe ein Verzeichnis „main“, das viele Unterverzeichnisse enthält, und in einigen dieser Unterverzeichnisse habe ich Dateinamen, die einen Doppelpunkt enthalten. Ich habe das Verzeichnis „main“ von Linux aus in ein GitHub-Repository hochgeladen, aber ich hatte ein Problem, als ich dann versuchte, auf einem Windows-Rechner aus diesem Repository zu ziehen, da Windows keine Doppelpunkte in Dateinamen zulässt.

Wie kann ich mithilfe des Linux-Terminals rekursiv alle Dateinamen mit einem Doppelpunkt im Hauptverzeichnis finden und den Doppelpunkt dann beispielsweise durch ein Bindestrichzeichen (-) ersetzen?

Antwort1

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(Wenn dieser Befehl bei Ihnen nicht funktioniert, lesen Sie den Kompatibilitätshinweis am Ende dieser Antwort.)

Dies ist eine einfache, sichere Version, die nur ausgibt, was passieren würde. Um dies tatsächlich zu erreichen, entfernen Sie die -nOption.

Es würde auch ohne funktionieren -name "*:*", aber es ist gut, findnur die Dateinamen durchzulassen, die geändert werden sollen, da dies den gesamten Befehl schneller macht.

Es funktioniert so:

  • findfindet...
    • ...in der /path/to/directoryRichtung...
    • ...alle Dateien ( -type f)...
    • ...mit übereinstimmenden Namen ( -name "*:*"),...
    • ...wird dann ausgeführt rename(bei Bedarf mehrmals)...
    • ... mit dem zu ersetzenden Muster :durch -...
    • ...auf alle gefundenen Dateien, mehrere Dateien gleichzeitig ( {} +).

Anmerkungen:

  • Der Befehl benennt keine Verzeichnisse um. Dies ist beabsichtigt.
  • Das Umbenennen funktioniert möglicherweise nicht mit einigen ungewöhnlichen Zeichen im Dateinamen (z. B. Zeilenumbruch). Mit großer Wahrscheinlichkeit haben Sie dort keine solchen Dateinamen, daher ist dies eher eine formale Anmerkung.

Hinweis zur Kompatibilität

Die Lösung verwendet ein Perl-Skript renameaus renameeinem Paket, das unter Debian und Ubuntu verfügbar ist. Andere Distributionen haben es möglicherweise renamevon util-linux.

Dieses Handbuchschlägt vor, dass die Lösung für Nicht-Perl renamewie folgt aussehen sollte:

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(Auch hier gilt: Entfernen, wenn es richtig aussieht.) Ich habe das allerdings nicht getestet. Ich glaube, es ersetzt nur den ersten Doppelpunkt in einem Dateinamen. Eine Problemumgehung besteht darin, den Befehl (ohne , mit ) -nzu wiederholen, bis keine Doppelpunkte mehr übrig sind.-n-v

Alternativ können Sie das Perl-Skript aus einem Archiv herunterladen, das aufDiese Seite(derzeit File-Rename-0.20.tar.gzheißt das Skript rename.PL). Siehe auchdiese Frage.

verwandte Informationen