
Ich habe eine Gruppe von Verzeichnissen, die jeweils genau 1 JPEG-Bild enthalten, wie so-
/psds/folder1/image.jpg
/psds/someotherfolder/picture.jpg
/psds/yetanotherfolder/thumbnail.jpg
Wie kann ich die JPEGs am besten in den Namen des Ordners umbenennen, in dem sie gespeichert sind? Ich möchte Folgendes:
/psds/folder1/folder1.jpg
/psds/someotherfolder/someotherfolder.jpg
/psds/yetanotherfolder/yetanotherfolder.jpg
Antwort1
Führen Sie die folgenden Befehle im /psds
Verzeichnis aus.
for f in ./*; do
if [ -d "$f" ] ; then
cd "$f"
mv *.jpg "$f.jpg"
cd ..
fi
done
Wenn Sie 3 Ordner im /psds
Verzeichnis wie unten haben,
/psds/folder1/image1.jpg
/psds/folder2/image2.jpg
/psds/folder3/image3.jpg
Nachdem Sie den obigen Befehl ausgeführt haben, werden die Dateien wie folgt umbenannt:
/psds/folder1/folder1.jpg
/psds/folder2/folder2.jpg
/psds/folder3/folder3.jpg
Antwort2
Du kannst den ... benutzenShell-ParametererweiterungKonstrukte ${VAR#PREFIX}
und ${VAR%SUFFIX}
um den Wert einer Variablen zu erhalten, wobei das angegebene Präfix oder Suffix entfernt wird. Wenn PREFIX ein Muster ist, wird die kürzeste übereinstimmende Zeichenfolge entfernt; mit ##
oder %%
wird stattdessen die längste Übereinstimmung entfernt. Diese Konstrukte sind in jeder Shell vom Typ sh (Bourne/POSIX) verfügbar, nicht nur in Bash.
Wenn der Wert von VAR
ein Pfad wie ist /path/to/directory/file
, dann "${VAR%/*}"
ist das Verzeichnis, das die Datei enthält, und "${VAR##*/}"
ist der Dateiname ohne den Verzeichnisteil. Beachten Sie, dass "${VAR%/*}"
nur korrekt ist, wenn $VAR
mindestens ein enthält /
, und "${VAR##*/}"
nur, wenn VAR
nicht mit endet /
. Es gibt auch Dienstprogramme namens dirname
und, basename
die in dieser Hinsicht zuverlässiger sind. Ähnlich ${VAR##*.}
verhält es sich mit der letzten Erweiterung.
for x in /psds/*/*.jpg; do
dir="${x%/*}"
mv "$x" "$dir/${dir##*/}.jpg"
done
Wie üblich hat zsh einen etwas kryptischen, aber kurzen und knackigen Weg.zmv
Die Funktion ist praktisch, um Dateien massenhaft umzubenennen.
autoload -U zmv # put this in your .zshrc
zmv '/psds/(*)/*.jpg' '/psds/$1/$1.jpg'
Ein anderer Ansatz mitModifikatoren für Verlaufserweiterungenzur Parametererweiterung:
zmv '/psds/*/*.jpg' '$f:h/$f:h:t.$f:e'