
Ich habe eine große Liste von Dateien mit Namen (Videos)
Ich habe es geschafft, alle Dateinamen in eine Textdatei zu schreiben. Jetzt habe ich eine Textdatei mit vielen Dateinamen (eine Episode pro Zeile). Jetzt brauche ich etwas, das diese Textdatei lesen und mir sagen kann, welche Episodennummer E
fehlt
S1-E18-(Date)-(Title)-(Random numbers).mp4
Hier ist ein Beispiel für eine Liste
S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100517-title-of-video-15457547.mp4
S10-E5-20100421-title-of-video-14467457.mp4
S5-E7-20120912-title-of-video-17467457.mp4
In diesem Fall ist es leicht zu erkennen, dass die Dateien S1-E2
fehlen S10-E4
. Aber wie kann ich die fehlenden Dateien finden, wenn ich eine große Liste habe? (Staffelnummer hinterlassen S1, S2
) Ich muss nur E
die Episodennummer überprüfen.
Die Nummer der größten vorhandenen Datei ist S50-E2184
und die Nummer der kleinsten vorhandenen Datei istS1-E1
Antwort1
Speichern Sie alle Namen in einer Datei mit dem Namen „file_with_list_of_files“ und führen Sie den folgenden Befehl in einem Linux-/Unix-Terminal aus [ich habe es in einem Mac-Terminal versucht]:
cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"
-- oder --
cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"
Hier werden alle Dateinamen aufgelistet, die nach dem ersten - (Bindestrich) kein E haben. Möglicherweise finden Sie auch andere, bessere Möglichkeiten, dies zu tun.
Antwort2
Bereiten Sie eine Datei mit allen Episodensignaturen vor. Sie haben uns nicht gesagt, wie viele Episoden es in jeder Staffel gibt, aber Sie müssen es natürlich wissen. So bereiten Sie die Datei vor:
>all_episodes # just to empty the file which may or may not exist printf 'S1-E%s\n' {1..3} >>all_episodes # 3 episodes in season 1 printf 'S2-E%s\n' {1..5} >>all_episodes # 5 episodes in season 2 printf 'S3-E%s\n' {1..8} >>all_episodes # and so on printf 'S50-E%s\n' {1..2184} >>all_episodes
Dies setzt voraus, dass jede Staffel mit ihrer eigenen Episode Nummer eins beginnt (Ihre Frage ist diesbezüglich nicht eindeutig). Die Datei besteht aus Zeilen in einer Form
S<n>-E<m>
, z. B.S2-E3
.Erstellen Sie eine Datei mit Ihren eigenen Episoden im gleichen Format:
cut -d - -f -2 your_current_list >owned_episodes
Der Befehl nimmt
-
alsDTrennzeichen und gibt Zeilenfragmente bis zumFFeld Nummer 2 aus Ihrer aktuellen Liste.Als Muster behandeln
owned_episodes
und filtern,all_episodes
um Zeilen ohne Muster zu finden:grep -vxFf owned_episodes all_episodes
Beachten Sie, dass wir hier verwenden
-x
; der Punkt istS50-E3
sollte nicht übereinstimmenS50-E31
.-F
ist in Ihrem Fall nicht notwendig, aberIm Algemeinenman sollte es verwenden, wenn man feste Zeichenfolgen liefert.OptionenSind:-F
Übereinstimmung mit festen Zeichenfolgen. Behandeln Sie jedes angegebene Muster als Zeichenfolge und nicht als regulären Ausdruck. [...]-f pattern_file
Lesen Sie ein oder mehrere Muster aus der durch den Pfadnamen benannten Dateipattern_file
. [...]-v
Wählen Sie Zeilen aus, die keinem der angegebenen Muster entsprechen. [...]-x
<newline>
Als übereinstimmende Zeilen werden nur Eingabezeilen betrachtet, die alle Zeichen in der Zeile außer dem abschließenden verwenden, um einer gesamten festen Zeichenfolge oder einem regulären Ausdruck zu entsprechen.