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 -n
Option.
Es würde auch ohne funktionieren -name "*:*"
, aber es ist gut, find
nur die Dateinamen durchzulassen, die geändert werden sollen, da dies den gesamten Befehl schneller macht.
Es funktioniert so:
find
findet...- ...in der
/path/to/directory
Richtung... - ...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 (
{} +
).
- ...in der
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 rename
aus rename
einem Paket, das unter Debian und Ubuntu verfügbar ist. Andere Distributionen haben es möglicherweise rename
von util-linux
.
Dieses Handbuchschlägt vor, dass die Lösung für Nicht-Perl rename
wie 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 ) -n
zu 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.gz
heißt das Skript rename.PL
). Siehe auchdiese Frage.