Fehlende Zahlen finden

Fehlende Zahlen finden

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 Efehlt

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-E2fehlen S10-E4. Aber wie kann ich die fehlenden Dateien finden, wenn ich eine große Liste habe? (Staffelnummer hinterlassen S1, S2) Ich muss nur Edie Episodennummer überprüfen.

Die Nummer der größten vorhandenen Datei ist S50-E2184und 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

  1. 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.

  2. 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.

  3. Als Muster behandeln owned_episodesund filtern, all_episodesum Zeilen ohne Muster zu finden:

    grep -vxFf owned_episodes all_episodes
    

    Beachten Sie, dass wir hier verwenden -x; der Punkt ist S50-E3sollte nicht übereinstimmen S50-E31. -Fist 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 Datei pattern_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.

verwandte Informationen