• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Ordner nach erstelldatum in neue Verzeichnisse umkopieren

nbraetter

Newbie
Hallöchen liebe Foren Gemeinde,

ich bin sehr neu in der Linux Community, und komme gleich mit einer großen Frage. Ich war bisher nur als Admin in einer kleinen Windows Umgebung unterwegs. Nun ist jedoch ein Linux Fileserver dazu gekommen.
Nun zu meiner Aufgabenstellung. Ich habe einen relativ großen Verzeichnisbaum mit Bilderordnern zu verwalten.

Diese sind bisher nur nach Kunden sortiert mit Unterverzeichnissen nach Monaten.

Jetzt soll Ich als Admin die Ordner nach erstelldatum raus filtern und in neue Verzeichnisse umkopieren oder verschieben.

Als Beispiel ....

Die vorhandenen Verzeichnisse als Beispiel.
/tmp/5b2a4b6add4a1 (Erstelldatum Januar 2018)
/tmp/5b2a6c68528d4 (Erstelldatum Maerz 2018)
/tmp/5b2d0fe250422 (Erstelldatum Mai 2019)
/tmp/5b2f6e880638b (Erstelldatum Juni 2020)

Die Ordner haben jedoch keine eindeutige Kennzeichnung wann der Ordner erstellt wurde. Hier bin ich auf das Geburtsdatum (Erstelltag) des Ordners angewiesen.
Wenn jetzt also der Ordner /tmp/5b2a4b6add4a1 im Januar 2018 erstellt wurde, so soll das Script dies erkennen, einen neuen Ordner /finished_orders/2018/ anlegen, darin das Verzeichnis 01 und den Ordner 5b2a4b6add4a1 aus dem Ordner /tmp/ in das Verzeichnis /finished_orders/2018/01/5b2a4b6add4a1 verschieben.

Wie kann ich das am einfachsten realisieren. Bin in der Shell Programmierung (egal ob Bash oder Python) absoluter Neuling.
Die Anforderung unserer Webprogrammierer wäre dann dieses Ergebnis.

/tmp/5b2a4b6add4a1 --> /finished_orders/2018/6/5b2a4b6add4a1
/tmp/5b2a6c68528d4 --> /finished_orders/2018/6/5b2a6c68528d4
/tmp/5b2d0fe250422 --> /finished_orders/2018/6/5b2d0fe250422
/tmp/5b2f6e880638b --> /finished_orders/2018/6/5b2f6e880638b

Ich hoffe Ihr könnt mir in der Angelegenheit weiter helfen, dies zu realisieren.

Liebe Grüße bis dahin.
 
nbraetter schrieb:
...
Die vorhandenen Verzeichnisse als Beispiel.
/tmp/5b2a4b6add4a1 (Erstelldatum Januar 2018)
/tmp/5b2a6c68528d4 (Erstelldatum Maerz 2018)
/tmp/5b2d0fe250422 (Erstelldatum Mai 2019) *
/tmp/5b2f6e880638b (Erstelldatum Juni 2020) **
...
/tmp/5b2d0fe250422 = 22.Juni 2018 - 17:04 *
/tmp/5b2f6e880638b = 24.Juni 2018 - 12:12 **

Schau nach ob das richtig ist
 
A

Anonymous

Gast
Was hier Gräfin Klara wohl meint, ist die Vermutung das hier in den ersten 8 HEX-ziffern die Erstellungszeit des Verzeichnisses kodiert ist, möglich, halte ich aber wegen der Abweichungen in den Beispielen für unwahrscheinlich.

nbraetter schrieb:
Ich habe einen relativ großen Verzeichnisbaum mit Bilderordnern zu verwalten.
Diese sind bisher nur nach Kunden sortiert mit Unterverzeichnissen nach Monaten.
Jetzt soll Ich als Admin die Ordner nach erstelldatum raus filtern und in neue Verzeichnisse umkopieren oder verschieben.

hier lauern einige Gefahren, denen du dir bewusst sein solltest. Es ist sicherlich nicht sonderlich schwer hier mit einem fehlerhaften Script auch Datenverlust zu provozieren, ich möchte das nicht alles im einzelnen aufzählen wo die Probleme überall lauern könnten. Das Beste ist, du bist dir vor irgendwelchen Aktionen Sicher, dass du ein Backup von diesen Dateien hast, das dieses auch okay ist, und das du eine Vorstellung hast, wie du notfalls wieder an die Daten im Backup kommen kannst. Prinzipiell wird dir hier im Forum wohl niemand etwas in die Hand geben worauf Garantie und Gewährleistung gegeben wird, das es ohne Probleme und ohne Datenverlust abläuft, natürlich auch ich nicht.

Problem hier sind einerseits, es sind ganze Verzeichnisse die verschoben werden oder kopiert werden sollen.
Von Verzeichnissen kann man unter Linux keine Hardlinks erstellen, (damit würde es weniger Gefährlich zu realisieren sein), und ein Problem sehe ich auch noch, die Zeitstempel der Verzeichnisse sind wohl aktuell die einzige Grundlage des Sortieralgorithmus und da sollte man sehr gut aufpassen das man sich diese nicht bei irgendwelchen unausgegoren Tests zerstört.
Eine gute Möglichkeit dieses per Script zu erledigen ist sicherlich ein Ansatz über Archive zu programmieren, cpio, tar, oder gleich über scp . Es gibt auch unzählige Hilfstools zum Verschieben und umbenennen von Dateien und Verzeichnissen, aber das macht es aber wahrscheinlich auch nicht einfacher, weil man eben oft keinen Standardsortierwunsch sondern Sonderwünsche hat.

hier aber mal ein kleines Script, das die Verzeichnisse verschieben würde.
Code:
#!/bin/bash
#Verschiebt Verzeichnisse in Unterverzeichnisse entsprechende der Modifiaktionszeit des Verzeichnisses 
# Aufruf:  ./Script.sh  Verzeichnisse 

#Bitte hier bei NEWDIR das Verzeichnis angeben in das verschoben werden soll
#Verzeichnis wird angelegt wenn es nicht existieren sollte, Schreibrechte vorausgesetzt
NEWDIR="/home/robi/tmp/"

mkdir -p ${NEWDIR}
for DIR in $@
do      
# Ermitteln der Verzeichniszeit und erstellen die Unterverzeichnisnamen
        DTime=$(stat -c "%y" ${DIR})
        TIME=${DTime::8}
        TIME=${TIME//-/\/}

# Zur Kontrolle welcher Befehlszeile  das Script ermittelt hat
        echo "mv ${DIR} ${NEWDIR}${TIME}$(basename $DIR)"

# die folgenden 3 Zeilen sind die eigentliche Ausfuehrung des Kommandos 
# diese sind  hier noch auskommentiert
#        mkdir -p ${NEWDIR}${TIME}
#        mv ${DIR} ${NEWDIR}${TIME}$(basename $DIR)
#        touch -d ${DTime} ${NEWDIR}${TIME}$(basename $DIR) 
done
Es sind einige Kommentare im Script, und die 3 Zeilen die letztlich die Verzeichnisse verschieben sind auskommentiert. Es muss also oben noch das Verzeichnis eingegeben werden, wo das hin soll, dann kann man schon mal testen was es machen würde. Bevor man die 3 Arbeitszeilen auskommentiert.

Das Script hat noch ein paar Schwächen, zB. Fehler werden nicht abgefangen, Es wird nicht geprüft ob überhaupt am Ziel genug Platz ist, und vor allem, darf man hier nicht ein paar hundert Tausend Verzeichnisse auf einmal im Kommando angeben, man läuft sonst bei tausenden von Verzeichnissen eventuell in das Problem das die Kommandozeile nicht unendlich lang sein darf, also immer nur ein paar hundert Verzeichnisse gleichzeitig mit einem Scriptaufruf verschieben wollen, so viele sollte schon gehen.

Habe mal ein paar Testdatein nach den Vorgaben die ich hier gefunden habe, erstellt
Code:
robi@localhost:/tmp> find 5* -ls
  1572911      4 drwxr-xr-x   2  robi     users        4096 Jan 24  2018 5b2a4b6add4a1
  1572916      0 -rw-r--r--   1  robi     users           0 Jan 24  2018 5b2a4b6add4a1/File_2.jpg
  1572915      0 -rw-r--r--   1  robi     users           0 Jan 24  2018 5b2a4b6add4a1/File_1.jpg
  1572917      0 -rw-r--r--   1  robi     users           0 Jan 24  2018 5b2a4b6add4a1/File_3.jpg
  1572912      4 drwxr-xr-x   2  robi     users        4096 Mär  5  2018 5b2a6c68528d4
  1572919      0 -rw-r--r--   1  robi     users           0 Mär  5  2018 5b2a6c68528d4/File_2.jpg
  1572918      0 -rw-r--r--   1  robi     users           0 Mär  5  2018 5b2a6c68528d4/File_1.jpg
  1572920      0 -rw-r--r--   1  robi     users           0 Mär  5  2018 5b2a6c68528d4/File_3.jpg
  1572913      4 drwxr-xr-x   2  robi     users        4096 Mai 10  2019 5b2d0fe250422
  1572922      0 -rw-r--r--   1  robi     users           0 Mai 10  2019 5b2d0fe250422/File_2.jpg
  1572921      0 -rw-r--r--   1  robi     users           0 Mai 10  2019 5b2d0fe250422/File_1.jpg
  1572923      0 -rw-r--r--   1  robi     users           0 Mai 10  2019 5b2d0fe250422/File_3.jpg
  1572914      4 drwxr-xr-x   2  robi     users        4096 Jun 13  2020 5b2f6e880638b
  1572925      0 -rw-r--r--   1  robi     users           0 Jun 13  2020 5b2f6e880638b/File_2.jpg
  1572924      0 -rw-r--r--   1  robi     users           0 Jun 13  2020 5b2f6e880638b/File_1.jpg
  1572926      0 -rw-r--r--   1  robi     users           0 Jun 13  2020 5b2f6e880638b/File_3.jpg

wie folgt Verzeichnisse angezeigt und verschoben. die Dateien werden als Argument dem Script übergeben hier mit Wildcard als "5*"
Code:
robi@localhost:/tmp> ls -ld  5*
drwxr-xr-x 2 robi users 4096 24. Jan 2018  5b2a4b6add4a1
drwxr-xr-x 2 robi users 4096  5. Mär 2018  5b2a6c68528d4
drwxr-xr-x 2 robi users 4096 10. Mai 2019  5b2d0fe250422
drwxr-xr-x 2 robi users 4096 13. Jun 2020  5b2f6e880638b

robi@localhost:/tmp>  ./test.sh  5*
mv 5b2a4b6add4a1 /home/robi/tmp/2018/01/5b2a4b6add4a1
mv 5b2a6c68528d4 /home/robi/tmp/2018/03/5b2a6c68528d4
mv 5b2d0fe250422 /home/robi/tmp/2019/05/5b2d0fe250422
mv 5b2f6e880638b /home/robi/tmp/2020/06/5b2f6e880638b

Ergebnis:
Code:
robi@localhost:/tmp> find /home/robi/tmp -ls
  1704042      4 drwxr-xr-x   5  robi     users        4096 Mär  9 23:09 /home/robi/tmp
  1704236      4 drwxr-xr-x   3  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2020
  1704238      4 drwxr-xr-x   3  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2020/06
  1704239      4 drwxr-xr-x   2  robi     users        4096 Jun 13  2020 /home/robi/tmp/2020/06/5b2f6e880638b
  1704242      0 -rw-r--r--   1  robi     users           0 Jun 13  2020 /home/robi/tmp/2020/06/5b2f6e880638b/File_2.jpg
  1704241      0 -rw-r--r--   1  robi     users           0 Jun 13  2020 /home/robi/tmp/2020/06/5b2f6e880638b/File_1.jpg
  1704243      0 -rw-r--r--   1  robi     users           0 Jun 13  2020 /home/robi/tmp/2020/06/5b2f6e880638b/File_3.jpg
  1704137      4 drwxr-xr-x   3  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2019
  1704138      4 drwxr-xr-x   3  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2019/05
  1704139      4 drwxr-xr-x   2  robi     users        4096 Mai 10  2019 /home/robi/tmp/2019/05/5b2d0fe250422
  1704166      0 -rw-r--r--   1  robi     users           0 Mai 10  2019 /home/robi/tmp/2019/05/5b2d0fe250422/File_2.jpg
  1704164      0 -rw-r--r--   1  robi     users           0 Mai 10  2019 /home/robi/tmp/2019/05/5b2d0fe250422/File_1.jpg
  1704230      0 -rw-r--r--   1  robi     users           0 Mai 10  2019 /home/robi/tmp/2019/05/5b2d0fe250422/File_3.jpg
  1704045      4 drwxr-xr-x   4  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2018
  1704128      4 drwxr-xr-x   3  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2018/03
  1704133      4 drwxr-xr-x   2  robi     users        4096 Mär  5  2018 /home/robi/tmp/2018/03/5b2a6c68528d4
  1704135      0 -rw-r--r--   1  robi     users           0 Mär  5  2018 /home/robi/tmp/2018/03/5b2a6c68528d4/File_2.jpg
  1704134      0 -rw-r--r--   1  robi     users           0 Mär  5  2018 /home/robi/tmp/2018/03/5b2a6c68528d4/File_1.jpg
  1704136      0 -rw-r--r--   1  robi     users           0 Mär  5  2018 /home/robi/tmp/2018/03/5b2a6c68528d4/File_3.jpg
  1704115      4 drwxr-xr-x   3  robi     users        4096 Mär  9 23:09 /home/robi/tmp/2018/01
  1704119      4 drwxr-xr-x   2  robi     users        4096 Jan 24  2018 /home/robi/tmp/2018/01/5b2a4b6add4a1
  1704125      0 -rw-r--r--   1  robi     users           0 Jan 24  2018 /home/robi/tmp/2018/01/5b2a4b6add4a1/File_2.jpg
  1704124      0 -rw-r--r--   1  robi     users           0 Jan 24  2018 /home/robi/tmp/2018/01/5b2a4b6add4a1/File_1.jpg
  1704127      0 -rw-r--r--   1  robi     users           0 Jan 24  2018 /home/robi/tmp/2018/01/5b2a4b6add4a1/File_3.jpg
Wie zu sehen sind hier die Zeitstempel der Verzeichnisse wieder original gesetzt worden. Die Dateien haben auch wieder die richtigen Zeitstempel.

wie gesagt, alles ohne Gewähr.

robi
 
OP
N

nbraetter

Newbie
Hallöchen in die Runde.

vielen Dank für die Lösungsansätze. Das mit dem Zeitstempel nach HEX Wert war tatsächlich etwas unsicher. Beim 2. Verzeichnis passte es. Die Daten oben sind allerdings tatsächlich "nur beispiele". Die Datumsangaben sind frei erfunden.

Ein Backup habe ich synchron zu den vorhandenen Daten. Das stellt kein Problem dar. Ausserdem steht das system aktuell noch in der Entwicklung. Also von da her haben wir uns ganz willkürlich Daten aus unserem Backup gepickt, diese alle Wahrlos in ein Verzeichnis gepackt, um einen kleinen Test Datenbestand zu haben.

Ich werde dein Script mal austesten, und berichten wie es funktioniert.
 
Oben