Organisieren von Dateien nach den darin enthaltenen Daten

Organisieren von Dateien nach den darin enthaltenen Daten

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/19im 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 $newpathund 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
    

verwandte Informationen