mv von Dateien und Ordnern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

mv von Dateien und Ordnern

Beitrag von jcw » 04.10.2022 21:04:04

Hallo!
Ich suche nach einer Befehlszeile, die mir folgende Dateien verschiebt. Hier seht ihr meine Verzeichnisstruktur, die verändert werden soll. Der Hauptordner heißt Fotos, darin befinden sich unzählige Ordner mit einem beliebigen Namen Album_01, Album_02,...,Album_99. Unterhalb dieser einzelnen Ordner gibt es nur den Ordner jpg. Dieser ist immer gleich benannt. Innerhalb dieses Ordners 'jpg' liegen dann die einzelnen Bilddateien, mit beliebigen Namen, aber immer auf *.jpg endend.

Code: Alles auswählen

|__Fotos
        |__Album01
        |        |_jpg
        |            |_Bild01.jpg
        |            |_Bild02.jpg
        |            |_Bild03.jpg
        |__Album02
                 |_jpg
                     |_Bild01.jpg
                     |_Bild02.jpg
                     |_Bild03.jpg
Mit einer Befehlszeile sollen dann alle *.jpg Dateien ein Verzeichnis nach oben geschoben werden und anschließend der Ordner jpg gelöscht werden.
Es soll dann so aussehen:

Code: Alles auswählen

|__Fotos
        |__Album01
        |        |_Bild01.jpg
        |        |_Bild02.jpg
        |        |_Bild03.jpg
        |__Album02
                 |_Bild01.jpg
                 |_Bild02.jpg
                 |_Bild03.jpg
Wichtig ist, dass ich den Befehl im Ordner Fotos abschicken kann, und alle Album-Ordner (01 bis 99) geändert werden; also alle *.jpg ein Verzeichnis nach oben schieben und den jpg-Ordner löschen. Das ist bestimmt mit find oder eine pipe darzustellen, aber ich bekomme es nicht hin. Nochmal ein Hinweis: Die Ordner Album_XY sind nicht fortlaufend nummeriert, sondern haben beliebige Namen. Die BildXY.jpg heißen auch immer unterschiedlich.
Vielen Dank.

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: mv von Dateien und Ordnern

Beitrag von JTH » 04.10.2022 21:19:03

Das geht recht schnell:

Code: Alles auswählen

#!/bin/sh

for album in Album*; do
	[ -d "$album/jpg" ] || continue
	mv -t "$album" "$album/jpg/"*.jpg
	rmdir "$album/jpg"
done

Falls die Alben nicht alle dem Muster AlbumXYZ folgen (vielleicht versteh ich dich da falsch), die Schleife einfach so ersetzen:

Code: Alles auswählen

for album in *; do

Falls da eine riesige Anzahl Bilder pro Ordner liegt, könnten das zu viele Argumente fürs mv sein. Dann müsst man das etwas umgestalten.
Manchmal bekannt als Just (another) Terminal Hacker.

jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Re: mv von Dateien und Ordnern

Beitrag von jcw » 05.10.2022 21:15:25

Super. Hat so geklappt. Jetzt sehe ich aber, dass ich noch eine andere Verzeichnisstruktur habe. Und ich kann das Skript nicht anpassen, da ich keine Ahnung vom Skripten habe.

Code: Alles auswählen

|__Fotos
        |__1970
        |     |_Album01
        |     |     |_jpg
        |     |        |_Bild01.jpg
        |     |        |_Bild02.jpg
        |     |        |_Bild03.jpg    
        |     |__Album02
        |            |_jpg
        |              |_Bild01.jpg
        |              |_Bild02.jpg
        |              |_Bild03.jpg
        |__1971
        |     |_Album01
        |     |     |_jpg
        |     |        |_Bild01.jpg
        |     |        |_Bild02.jpg
        |     |        |_Bild03.jpg    
        |     |__Album02
        |              |_jpg
        |                 |_Bild01.jpg
        |                 |_Bild02.jpg
        |                 |_Bild03.jpg
        |__1972...........

Soll dann wie folgt aussehen:

Code: Alles auswählen

|__Fotos
        |__1970
        |     |_Album01
        |     |       |_Bild01.jpg
        |     |       |_Bild02.jpg
        |     |       |_Bild03.jpg    
        |     |__Album02
        |             |_Bild01.jpg
        |             |_Bild02.jpg
        |             |_Bild03.jpg
        |__1971
        |     |_Album01
        |     |       |_Bild01.jpg
        |     |       |_Bild02.jpg
        |     |       |_Bild03.jpg    
        |     |__Album02
        |              |_Bild01.jpg
        |              |_Bild02.jpg
        |              |_Bild03.jpg
        |__1972...........

Eigentlich wie oben schon beschrieben. Alle *.jpg eine Ebene höher verschieben und dann das Verzeichnis jpg löschen. Die Schleife muss nun irgendwie noch ein Verzeichnis tiefer gehen. Das Skript möchte ich wieder vom Verzeichnis Foto starten. Die Alben 1970, 1971,... sind nicht fortlaufend nummeriert. Genauso auch die Alben Album01,Album02,... und die Bilder Bild01.jpg,Bild02.jpg,...
Danke für die Hilfe!

tobo
Beiträge: 2347
Registriert: 10.12.2008 10:51:41

Re: mv von Dateien und Ordnern

Beitrag von tobo » 05.10.2022 21:37:07

Das Verzeichnis oberhalb von Album* ist variabel, also */Album*:

Code: Alles auswählen

#!/bin/sh

for dir in */Album*; do
    [ -d "$dir/jpg" ] || continue
    mv -t "$dir" "$dir/jpg/"*.jpg
    rmdir "$dir/jpg"
done
Die Anzahl der darüberliegenden Verzeichnisse (1) wäre jetzt sozusagen hartcodiert. Man könnte auch (falls da noch mehr Zwischenverzeichnisse hinzukommen) mittels shopt -s globstar und dann über ** das variabel halten.

jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Re: mv von Dateien und Ordnern

Beitrag von jcw » 06.10.2022 21:20:35

Klappt perfekt. Danke für die Unterstützung!

Antworten