Ich versuche, eine Datei basierend auf einem Muster über Bash Script zu verschieben.
Ich verwende find, um alle meine Camcorder-Dateien und das Bestandsergebnis in TXT File auszuwählen.
Jede meiner Camcorder-Dateien enthält das Jahr. Ich würde gerne Grep oder etwas anderes verwenden, um diese Zeichenfolge zu finden (Jahr mit 4 Ziffern, dh 1984) und diese Zeichenfolge vergleichen, um die Datei in einen anderen Ordner zu verschieben. Wenn die Datei nach 1984 ist, muss meine Datei gehe in den Ordner "Marie", wenn die Datei vor oder nach 1984 ist, muss sie in den Ordner "Marie_Liam" gehen.
Ich habe verschiedene Dinge versucht, mit Grep und während read -r line, aber wenn ich gefundene Zeichenfolge (Jahr) vergleiche, kehre mein Skript jedes Mal nach 1984 zurück ...
Hier sind meine anderen Versuche:
Ich habe verschiedene Dinge wie dieses ausprobiert (es sind viele Versuche, nicht nur ein Skript):
Basisskript:
#!/bin/bash
find /home/CamFiles/ -name "*.m2ts"
Versuch 1:
TestScriptResultFile="/home/Dio/CamCorderFindResult.file"
do
if [ grep -e " 1984 " "$in" ];
then
echo "Voici un film qui est avant 1984 $FindMovie"
else
echo "Voici un film qui est de 1984 : $FindMovie"
fi;
done
-- Noch ein Versuch --
while IFS= read -r line; do
if [[ /bin/grep -E "[1][9][8][4]" "$MyLine" != 0 ]] ;
then
echo "Ok"
fi
done < "$TestScriptResultFile"
while read line; do
if echo "$line" | grep -q "[1][9][8][4]"; then echo "$line"; fi
Found=$(echo "$line" | grep -q "[1][9][0-8][0-4]")
if [[ " $Found " <= 1984 ]]; then echo "$line"; fi
done < "$TestScriptResultFile"
exit 0
-- Noch ein Versuch --
while read MyLine
do
if grep -E "$MyPattern" "$MyLine"
then
echo "tourne apres 1984 : $MyLine"
else
echo "Tourne avant 1984 : $MyLine"
fi
done < "$TestScriptResultFile"
Danke für Ihre Hilfe.
Freundliche Grüße.
quelle
1984
. Um exifinfo zu lesen, ist es besser,exiftool
oderexiftran
Antworten:
Ich habe die Skripte basierend auf den in Ihrem Kommentar angegebenen Dateinamenbeispielen aktualisiert:
Ich habe mir zwei Methoden ausgedacht, um diese Namenskonvention zu handhaben.
Die erste ist anzunehmen, dass das Jahr in jedem Fall in Klammern steht. Ich habe das 'erste' Skript aktualisiert, um diesen Fall widerzuspiegeln. Es ist einfach eine Aktualisierung des verwendeten Regex-Musters.
Das zweite Skript wurde aktualisiert, um eine andere Methode zu zeigen, bei der wir nicht sicher sein können, ob das Jahr in Klammern steht. Hier lesen wir das Ergebnis der grep-Auswertung als Array aus, falls es mehrere Übereinstimmungen gibt, und führen dann eine Überprüfung des Jahres durch - dh das Jahr muss zwischen 1970 und 2020 liegen; Ansonsten nehmen wir an, dass es kein Jahr ist.
Beachten Sie, dass der
readarray
Befehl (auch Mapfile genannt) nur in Bash-Versionen 4.x + verfügbar ist. Am unteren Rand ist eine tragbare Version mit nurread
. Es kann schwierig sein , die Ausgabe zu analysieren,find
ohne dass aufgrund von Leerzeichen oder Sonderzeichen in den Dateinamen Fehler auftreten.Skript 1
1. Verwenden Sie den
find
Befehl, um eine Dateiliste abzurufen und mit ein Array zu speichernreadarray
.IFS=$'\n'
-exec
Argument,find
dasbasename
für jede Datei ausgeführt wird, um nur den Dateinamen und nicht den Pfad abzurufen.find
Ausgangssignal wird in ein Array gerichtet durch die Verwendung Befehls Substitution und A ‚ Hier String‘ ,<<<
und denreadarray
Befehl2. Durchlaufen Sie das Array mit den Dateinamen
3. Verwenden Sie grep und regexPat, um das eingebettete Jahr zu finden
Das Regex-Muster, das ich verwendet habe, stimmt mit 6 Zeichen in einer Zeichenfolge überein, wenn das erste Zeichen ein a ist
(
, gefolgt von genau 4 Zahlen[0-9]{4,4}
und abgeschlossen durch ein a)
am Ende.Um nur die 4 Zahlen dazwischen (hoffentlich das Jahr) auszugeben, wird das Argument
-P
gegeben, nach 'Perl Regex' zu suchen, wodurch unter anderem übereinstimmende Zeichen von erfassten (Ausgabe-) Zeichen getrennt werden können./K
wird dazu führen, dass grep nichts ausgibt, was vor dem/K
in dem Muster übereinstimmt (auch bekannt als Look-Ahead ).Schließlich wird das Schließen
)
aus der Ausgabe entfernt, indem ein Look-Behind-Non-Capture verwendet wird, das dem ähnelt/K
. Sie können für beide dieselbe Syntax verwenden. Das untere Skript zeigt die Look-Ahead-Methode, die nicht verwendet wird/K
.Das
-o
Flag weist grep an, nur den erfassten, übereinstimmenden Teil der Zeichenfolge auszugeben, in unserem Fall eine 4-stellige Zahl.Der Rest des Skripts prüft die Nummer gegen 1984 und protokolliert sie entsprechend.
Hier ist ein weiterer kompakterer Ansatz.
2 Dinge, die hier zu beachten sind
find
wird das Argument gegeben,-print0
das die Ausgabe beendet.read
Befehl erhält das Argument-d ''
, das angibt, dass seine Eingabe mit Null beendet ist. Eine Nullzeichenfolge wird normalerweise\0
im Klartext geschrieben . in Bash können Sie''
oder verwenden$'\0'
Skript 2
quelle