Sortieren von Dateien nach Dateinamen

Sortieren von Dateien nach Dateinamen

Ich versuche, meine Dateien nach Muster in Dateinamen zu sortieren, indem ich ein Linux-Skript (Bash) erstelle.

Meine Dateien sind meistens .JPG, einige .AV und .MP4. Ich kann keine Meta-Tags verwenden, da diese Dateien defekte Tags haben (wiederhergestellt nach RAID-Absturz).

Die meisten meiner Dateien haben Tags wie dieses: Seaxxx_A01_xxx.jpg oder Beach_xxx_A01A02_xxx.jpg oder Mountain_xxx_A04A12_xxx.jpg (das ist meine Referenz dafür, wer die Bilder gemacht hat und welches Gerät, z. B. Kamera, Spiegelreflexkamera usw.).

Ich muss die Datei basierend auf dem Dateinamen im richtigen Ordner und Unterordner ablegen.

Ich denke, ich kann diese Aufgabe folgendermaßen lösen:

verwenden Sie „Suchen“, suchen Sie nach dem Muster [AZ][0-2][0-6] oder [AZ][0-2][0-6][AZ][0-2][0-6], wenn dieses Muster gefunden wird, suchen Sie nach dem ersten Teil des Dateinamens (also Meer, Strand, Berg, Familie usw. immer als erste Wörter, normalerweise habe ich vorher nichts anderes) und verwenden Sie den ersten Teil, um nach einem Ordner mit einem ähnlichen Namen zu suchen und ihn abzulegen (wenn meine Datei enthält: Sea_Royan_xxx_A04A10_xxx.jpg und ich nur einen Ordner mit dem Namen „Sea“ habe, muss sie dort abgelegt werden).

In jedem Ordner sind Unterordner vorhanden, beispielsweise A01, A02, A03, A04 oder Dio, Sandy, Mael usw. ... und ich möchte, dass die aktuell gefundene Datei (also dieselbe, die im übergeordneten Ordner „Sea“, „Mountain“ usw.) auf das zweite oben aufgeführte Muster überprüft wird, um sie in den richtigen Unterordner einzufügen.

Tatsächlich und noch einfacher muss ich Folgendes tun: Nach Dateien suchen, wenn sie gefunden werden, den Dateinamen überprüfen und zwei Muster verwenden, um sie in den richtigen Ordner und die richtigen Unterordner zu verschieben.

Sagen Sie mir, wie ich das machen kann (ich weiß, wie man anhand eines Musters nach Dateien sucht, aber nicht, wie man den aktuell gefundenen Dateinamen liest und bei diesem Dateinamen nach zwei Mustern sucht, die als korrekter PFAD verwendet werden sollen). Wenn Sie einen einfacheren oder besseren Weg kennen, lassen Sie es mich gerne wissen!

Antwort1

Hier ist ein möglicher Ansatz, der allerdings wahrscheinlich weder der schönste noch der originellste ist. Die Idee besteht darin, reguläre Ausdrücke in awk zu verwenden, um die relevanten Teile aus Dateinamen zu extrahieren. Dann fahren wir mit der Erstellung des Shell-Befehls „move“ (mv) in awk fort. Schließlich verwenden wir den in awk verfügbaren Systembefehl, um den Befehl auszuführen und die Dateien in die richtigen Unterordner zu verschieben.

Versuchen Sie zunächst Folgendes, um eine ausführliche Beschreibung zu erhalten:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd }'

Ergebnis:

Command to be run:  mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run:  mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run:  mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02

Um den Befehl tatsächlich auszuführen, fügen Sie am Ende der Anweisung system(cmd) hinzu:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'

Sie möchten wahrscheinlich nur den regulären Ausdruck an Ihre Bedürfnisse anpassen. Ich gehe davon aus, dass Sie mit regulären Ausdrücken vertraut sind. Hier erfassen wir zwei Teile der Dateinamen. Die Erfassungsgruppen sind in Klammern eingeschlossen.

Beginnend am Anfang des Dateinamens erfassen wir alles, was kein Unterstrich ist, bis wir einen Unterstrich finden. Dann suchen wir weiter, bis wir das Muster A##### finden, wobei # Buchstaben/Ziffern darstellt (die zweite Erfassungsgruppe). Wir erfassen, bis wir auf den nächsten Unterstrich stoßen.

verwandte Informationen