Linux rekursive Umbenennen von Dateien

1192
Don Smythe

Ich versuche, alle Dateien innerhalb eines Verzeichnisses und der Unterverzeichnisse rekursiv in Kleinbuchstaben umzubenennen, wobei die Verzeichnisnamen jedoch unverändert bleiben.

Alle Beispiele, die ich gefunden habe, benennen beide Dateien und Verzeichnisse in Kleinbuchstaben um, zB:

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";" 

und

find . -type f|while read f; do mv "$f" "$(echo $f|tr '[:upper:]' '[:lower:]')"; done 

Wie kann ich Verzeichnisse unverändert lassen, aber alle Dateien umbenennen?

1
Was ist das Problem mit dem zweiten? `-type f` listet nur reguläre Dateien auf. Verzeichnisse werden nicht aufgelistet. vor 9 Jahren 0
Sie können auch den `-type f` zum ersten` find'-Befehl hinzufügen, der für mich die einfachste, klarste und leichter zu merkende Art ist, dies zu tun. The Peach vor 9 Jahren 1

1 Antwort auf die Frage

2
αғsнιη

Sie erhalten eine Umbenennung für Verzeichnisnamen, da der findBefehl den vollständigen Pfad der Dateinamen zurückgibt. Anschließend wird der Umbenennungsbefehl ausgeführt. Wenn Sie eine Datei im Verzeichnis haben DIR1/FILE, wird sie umbenannt in, dir1/filewährend Sie das Verzeichnis nicht umbenennen möchten.

Hier ist der Befehl, nur Dateinamen umzubenennen:

find . -type f -exec rename -n 's:([^/]*$):lc($1):e' {} + 

In obigem Befehl ([^/]*$)stimmt nur der letzte Teil des Pfads überein, der keine /Klammern enthält, (...)die den übereinstimmenden Teil als Gruppe von Übereinstimmungen bilden. Übersetzen Sie dann den übereinstimmenden Teil ( $1ist der Index der ersten übereinstimmenden Gruppe) mit lc()Funktion in Kleinbuchstaben .

Bei dem müssen Sie die -nOption zum Umbenennen aktueller Dateien nutzen.

-exec ... {} +ist für Befehle, die zu einem Zeitpunkt mehr als eine Datei nehmen (z cat, stat, ls). Die gefundenen Dateien findwerden wie ein xargsBefehl miteinander verkettet . Dies bedeutet weniger Ausweichen und kann bei kleinen Operationen eine erhebliche Beschleunigung bedeuten. [ Antwort von @Oli ]

Das letzte Verzeichnis in der Struktur wird jedoch immer noch umbenannt. Kann aber behoben werden, wenn zu: find wechseln. -name "* .type" -exec umbenannt: ([^ /] * $): lc ($ 1): e '{} + vor 9 Jahren 0
@DonSmythe Äh, richtig, ich habe `-type f` verpasst. das behoben. Danke dir. αғsнιη vor 9 Jahren 0