
Ich versuche gerade, ein Skript zu schreiben, das eine Liste von Dateien nach Datum in Unterverzeichnisse organisiert. Die Daten sind in der ersten Zeile jeder Datei im Format enthalten YYYY-MM-DD
. Ich habe die erste Zeile aus jeder Datei mit dem Befehl head extrahiert und das durch ersetzt, -
sodass /
es zu wird YYYY/MM/DD
. So kann ich es als Dateipfad verwenden.
Ich möchte dann Unterverzeichnisse erstellen YYYY>MM>DD
, in denen beispielsweise die Datei mit dem Datum 2015/10/19
im Dateipfad ./2015
-> ./2015/10
-> gespeichert ist ./2015/10/19
. Diese Unterverzeichnisse sollten in erstellt werden ~/fileList/
.
Dies ist der Code, den ich bisher habe.
for file in ~/fileList/*
do
head -1 $file | tr "-" "/")
done
Dies ist eine Beispieldatei
2001-02-03
Thursday
Paris
44952
Ich habe Mühe, eine Möglichkeit zu finden, die Unterverzeichnisse zu erstellen und jede Datei im richtigen Verzeichnis zu speichern. Ich wäre für jeden Codevorschlag sehr dankbar.
Ich verwende die Bash-Shell.
Antwort1
Folgendes sollte genügen:
for file in ~/fileList/*
do
newpath=$(head -1 "$file" | tr '-' '/')
mkdir -p "$newpath"
echo "would now execute 'mv $file $newpath'"
done
Dadurch wird das transformierte Datum in der Variable gespeichert $newpath
und dieses Verzeichnis zusammen mit allen fehlenden übergeordneten Elementen erstellt, falls es noch nicht vorhanden ist. Das Unterverzeichnis wird in dem Verzeichnis erstellt, in dem Sie das Skript ausführen.
In der aktuellen Form wird der Befehl ausgegeben, der ausgeführt werden soll. Wenn Sie zufrieden sind, ändern Sie ihn in
mv "$file" "$newpath"
Aktualisieren:Da Sie angegeben haben, dass sich die Zielverzeichnisse unterhalb des Quellverzeichnisses befinden, in dem sich Ihre Dateien ursprünglich befanden, sind Prüfungen erforderlich, um sicherzustellen, dass das Skript bei mehrmaliger Ausführung nicht auf diese neu generierten Einträge stößt.
- Wenn Sie die Dateien anhand ihrer Erweiterung (z. B.
.txt
) identifizieren können, können Sie die Schleife spezifischer gestalten:for file in ~/fileList/*.txt do newpath=~/fileList/$(head -1 "$file" | tr '-' '/') ... done
- Andernfalls besteht eine Möglichkeit darin, nur reguläre Dateien als Operanden zu akzeptieren:
for file in ~/fileList/* do if [[ ! -f $file ]]; then continue; fi newpath=~/fileList/$(head -1 "$file" | tr '-' '/') mkdir -p "$newpath" mv "$file" "$newpath" done