Shell-Skripting: Wie verwende ich einen Teil des Dateipfads als Dateinamen?

Shell-Skripting: Wie verwende ich einen Teil des Dateipfads als Dateinamen?

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 /psdsVerzeichnis aus.

for f in ./*; do
    if [ -d "$f" ] ; then
        cd "$f"
        mv *.jpg "$f.jpg"
        cd ..
    fi
done

Wenn Sie 3 Ordner im /psdsVerzeichnis 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 VARein 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 $VARmindestens ein enthält /, und "${VAR##*/}"nur, wenn VARnicht mit endet /. Es gibt auch Dienstprogramme namens dirnameund, basenamedie 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.zmvDie 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'

verwandte Informationen