Shell - Dateien verschieben mit Muster

Meilenstein

Mitglied
Thread Starter
Mitglied seit
15.01.2005
Beiträge
429
Hallo zusammen
habe durch eine falsche Einstellung jetzt in einem Verzeichnis knapp 1 Mio. Dateien, so dass ich Probleme habe mir diese Stichprobenartig überhaupt ansehen zu können.
Die Dateien sehen vom Dateinamen etwa wie folgt aus. 2020-09-01_xx_yy_abc.jpg
Heißt am Anfang ist immer das Erstellungsdatum der Datei im Dateinamen vorhanden, danach kommen je nach Datei noch weitere Buchstaben, (Sonderzeichen), Ziffern, je nachdem. Länge des Dateinamens ist immer gleich

Meine Idee wäre jetzt, das ganze ein wenig zu sortieren in Unterordner, welche mit dem Datum beginnen, so dass ich alle Dateien vom 2020-09-01 in einen Ordner verschiebe der dieses Datum trägt. usw.
So wäre das ganze aufgeteilt und ich könnte in Stichproben einzelne Tage ansehen.

Leider bin ich mit Shell Programmierung nicht fit. Ich kann die Scripte zwar lesen und auch meist verstehen was sie tun, nicht jedoch selbst schreiben.
Könnt ihr mir hier weiterhelfen oder zumindest einen Ansatz liefern mit welchem ich weiterarbeiten könnte?
Vielen Dank schon einmal vorab.
 

oneOeight

Mitglied
Mitglied seit
23.11.2004
Beiträge
54.572
mkdir 2020-09-01
mv 2020-09-01_* 2020-09-01

Das wäre die grobe Grundstruktur.
Das kannst noch weiter verschönern, automatisch die Ordner aus dem Datum erstellen mit regexp erstellen usw.
 

tigion

Mitglied
Mitglied seit
21.06.2006
Beiträge
1.154
Code:
#!/bin/bash
for file in `find *.jpg -maxdepth 0 -type f`; do
  folder="_review/"`echo $file | cut -d_ -f1`
  mkdir -p "${folder}"
  cp "${file}" "${folder}/"
done
So auf die schnelle ohne größere Prüfungen. Das Script müsste alle Dateien im aktuellen Verzeichnis, welche auf '.jpg' enden nehmen und unter '_preview' ein Verzeichnis mit dem Teil vor dem ersten '_' erstellen und die Dateien dann hinein kopieren.
 

Meilenstein

Mitglied
Thread Starter
Mitglied seit
15.01.2005
Beiträge
429
Super danke Euch für die Tips!
Hab das Shellskript mal bei einem anderen Ordner testweise ausprobiert. sieht sehr gut aus! Danke auch für die anderen Tips, werde ich mir bei Gelegenheit ebenfalls einmal ansehen.

Nachtrag:
zu früh gefreut, bekomme folgende Fehlermeldung:
Bash:
./verschieben.sh: line 6: /opt/bin/find: Argument list too long
 

Meilenstein

Mitglied
Thread Starter
Mitglied seit
15.01.2005
Beiträge
429
Bin jetzt wie folgt vorgegangen.
Shellscript erstellt mit folgendem Inhalt (natürlich mehr Zeilen jeweils pro Jahr-Datum)
Bash:
find . -name '2019-11*' -exec mv {} /share/Temp/2019-11/ \;
Das Skript läuft jetzt zumindest mal seit heute Nacht ohne Fehlermeldung. Im Zielverzeichnis sind schon sehr vielen Dateien einsortiert worden. Einzig bei einzelnen Dateien meint er diese nicht finden und damit verschieben zu können ... aber das ist vermutlich ein anderes Problem
 

tigion

Mitglied
Mitglied seit
21.06.2006
Beiträge
1.154
Nachtrag:
zu früh gefreut, bekomme folgende Fehlermeldung:
Bash:
./verschieben.sh: line 6: /opt/bin/find: Argument list too long
Wie du schon bemerkt hast, ist in meinem Beispiel die Lösung mit dem `*` ungünstig, da so bei zu vielen Dateien die maximale Länge der Argumente die `find` aufnehmen kann überschritten wird. Eine besser Variante (inklusive der Beachtung möglicher Leerzeichen im Dateinamen), ähnlich deiner bei `find`, wäre wie folgt:

Bash:
#!/bin/bash
find . -maxdepth 1 -type f -name '*.jpg' | while read -r file; do
  folder="_review/"`echo $file | cut -d_ -f1`
  #folder="/share/Temp/"`echo $file | cut -d_ -f1`
  mkdir -p "${folder}"
  cp "${file}" "${folder}/"
  #mv "${file}" "${folder}/"
done
Für ein Verschieben entsprechend `cp` durch ein `mv` ersetzen.

Was ist denn die Fehlermeldung, dass er einige Dateien nicht finden und verschieben kann?
 
Zuletzt bearbeitet:

Meilenstein

Mitglied
Thread Starter
Mitglied seit
15.01.2005
Beiträge
429
Danke für die vielen Infos. Werde dies bei Gelegenheit mal ausprobieren. Muss dazu nur erstmal wieder Dateien "generieren" :coffee:

Was ist denn die Fehlermeldung, dass er einige Dateien nicht finden und verschieben kann?
Hab die Meldung leider nicht weggespeichert.
Sinngemäß "file xx not found. cannot mv file to /share/temp/xx"

Einzelne Dateien hatte ich aber geprüft und die waren dennoch am Zielort vorhanden. :unsure: