Shell - Dateien verschieben mit Muster

M

Meilenstein

Aktives Mitglied
Thread Starter
Dabei seit
15.01.2005
Beiträge
439
Reaktionspunkte
23
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.
 
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.
 
  • Gefällt mir
Reaktionen: Meilenstein, mausfang und wegus
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.
 
  • Gefällt mir
Reaktionen: Meilenstein
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
 
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
 
  • Gefällt mir
Reaktionen: mausfang
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:
  • Gefällt mir
Reaktionen: Meilenstein
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:
 
Zurück
Oben Unten