Ich habe eine Liste von Ordnern, die Daten für Namen haben. Die Daten haben das Format JJJJMMTT (zB 20150129). In diesen Ordnern befinden sich Textdokumente, die sich auf dieses bestimmte Datum beziehen.
Ich möchte sie in einer Ordnerhierarchie von Jahr zu Monat bis heute umstrukturieren und die Textdokumente in den entsprechenden 'Datums'-Ordner weiter unten in der Hierarchie verschieben.
Mit anderen Worten, ich möchte, dass der Ordner 'root' nach dem Jahr wie 2015 benannt wird, und dann Unterordner mit Monaten wie 01 und dann weitere Unterordner mit Datumsangaben wie 29 erstellen, die die entsprechenden Textdokumente enthalten .
Der Weg würde also so aussehen 2015/01/29/file.txt
oder 2015>01>29>file.txt
.
Ich habe mir Automator angesehen und es scheint, dass so etwas nicht möglich ist, obwohl ich mich irren könnte, also würde ich gerne wissen ...
Gibt es eine einfache Lösung für dieses Problem, die jeder Laie verstehen kann, beispielsweise einen Automator-Workflow, oder erfordert dies ein gewisses Verständnis der Terminalbefehle und regulären Ausdrücke?
Wie würde man dieses Problem lösen, wenn es tatsächlich eine Lösung gibt?
Antworten:
Angenommen, alle diese JJJJMMTT-Ordner sind Teil desselben übergeordneten Verzeichnisses, das Sie ausführen könnten
for d in */; do
Schleife liest alle Verzeichniseinträge, die Nachverfolgung/
stellt sicher, dass nur die Verzeichnisnamen tatsächlich übereinstimmen[[ $d =~ [0-9]{8}/ ]]
Testet, ob der aktuelle Eintrag aus 8 Ziffern besteht, und fährt mit dem nächsten Eintrag fort, wenn nicht${d:0:4}/${d:4:2}/${d:6:2}
Verwendet die Parametererweiterung innerhalbbash
, um eine Zeichenfolge zu erstellen, die den neuen Pfad enthält--
in beidenmkdir
undmv
verhindert Probleme, falls das Verzeichnis oder der Dateiname mit a beginnt-
. Das kann hier nicht passieren, aber es ist wahrscheinlich trotzdem eine gute Übung.Vielen Dank an @terdon und @ user3439894 für Ideen zur Verbesserung des ursprünglichen Skripts.
quelle
Im Terminal können Sie Folgendes verwenden.
cd
Führen Sie dann den folgenden Ordner aus:find . -type f
Ruft jede Datei im aktuellen Verzeichnis rekursiv ab.-exec bash -c
öffnet eine Shell, um die folgenden Befehle auszuführen.F=$(…)
Öffnet eine Subshell und verwendet sed im Dateipfad, um den Pfad in die Ordner zu bearbeiten.^\./([0-9]{4})([0-9]{2})([0-9]{2})
ist eine Regex mit drei Erfassungsgruppen wie folgt: Ersetzt, wobei jede Erfassungsgruppe ( usw.) durch getrennt ist . Erstellt die Verzeichnisse, in die die Dateien verschoben werden sollen. verschiebt jede Datei in den entsprechenden Ordner.\1/\2/\3
\1
/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"
Dadurch wird die Hierarchie links in die Hierarchie rechts konvertiert:
Wenn sich im enthaltenden Ordner andere Dateien mit einem Datum als Namen befinden, werden sie so verschoben, als wären sie ein Ordner. Um dies zu verhindern, ersetzen Sie die zweite Zeile durch:
Das
(?:/.+)
stellt sicher, dass der Pfad eine nachfolgende Komponente hat, und ignoriert daher alles ohne untergeordnetes Element im übergeordneten Verzeichnis, bei dem es sich um Dateien handelt.quelle