Ich habe beispielsweise folgende Dateien:
./dirA/fileA.png
./dirA/fileB.png
./dirA/fileC.png
./dirB/fileD.png
./dirB/fileE.png
./dirB/dirC/fileF.png
Gibt es einen einzeiligen Befehl oder ein Skript, um den Dateinamen wie folgt umzubenennen?
./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB/[email protected]
./dirB/[email protected]
./dirB/dirC/[email protected]
Antwort1
Versuchen:
find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;
find .
Dadurch wird eine Dateisuche im aktuellen Verzeichnis gestartet.
-type f
Dadurch wird die Suche auf normale Dateien beschränkt.
-name '*.png'
Dadurch wird die Suche auf Dateien beschränkt, deren Namen mit enden
.png
.-execdir bash -c '...' Move {} \;
Dadurch wird der Befehl in einfachen Anführungszeichen mit „
$0
zugewiesen an“Move
und$1
„zugewiesen an“ ausgeführt, dem Namen der gefundenen Datei. In unserem Fall lautet der Befehl in einfachen Anführungszeichen:mv "$1" "${1%.png}@2x.png"
Dadurch wird die Datei umbenannt und endet mit
@2x.png
. Die Konstruktion${1%.png}
entfernt das.png
vom Ende des Dateinamens. Somit${1%.png}@2x.png
ersetzt das.png
am Ende des Dateinamens durch@2x.png
.
Beispiel
Beginnen wir mit Verzeichnissen mit diesen Dateien:
$ find .
.
./dirA
./dirA/fileA.png
./dirA/fileC.png
./dirA/fileB.png
./dirB
./dirB/fileE.png
./dirB/dirC
./dirB/dirC/fileF.png
./dirB/fileD.png
Lassen Sie uns nun unseren Befehl ausführen:
$ find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;
Nachdem der Befehl ausgeführt wurde, haben wir jetzt diese Dateien:
$ find .
.
./dirA
./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB
./dirB/dirC
./dirB/dirC/[email protected]
./dirB/[email protected]
./dirB/[email protected]