Encuentra números que faltan

2

Tengo una gran lista de archivos con nombres (videos)

Logré escribir todos los nombres de archivo en un archivo de texto. Ahora tengo un archivo de texto con muchos nombres de archivo (un episodio por línea) Ahora necesito algo que pueda leer ese archivo de texto y decirme qué Enúmero de episodio falta

S1-E18-(Date)-(Title)-(Random numbers).mp4

Aquí hay un ejemplo de una lista

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

En este caso es fácil ver que faltan los archivos S1-E2y S10-E4. pero si tengo una gran lista, ¿cómo puedo encontrar los archivos que faltan? (Deje el número de temporada S1, S2) solo necesita marcar el Enúmero de episodio

El número de archivo existente más grande es S50-E2184y El número de archivo existente más pequeño esS1-E1

Eli Shain
fuente
Tu ejemplo no es muy bueno.
harrymc
¿Es fijo el número de episodios para cada temporada? o al menos conocido?
Glenn Jackman
@EricF No probé nada
Eli Shain
@harrymc Sé que mi inglés no es bueno,
Eli Shain
2
Tu inglés es lo suficientemente bueno. Entiendo que falta S10-E4, pero ¿qué pasa con S10-E1 a E3 y E5 a lo que sea y no sabemos el último número? No proporciona suficiente información para comprender el problema completo.
harrymc

Respuestas:

0

Guarde todos los nombres en un archivo con el nombre "file_with_list_of_files" y ejecute el siguiente comando en un terminal linux / unix [Lo probé en el terminal mac]:

cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"

- o -

cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"

Esto enumera todos los nombres de archivo que no tienen una E después del primero - (guión). También puede encontrar otras formas mejores de hacerlo.

Robert Ranjan
fuente
0
  1. Prepare un archivo con todas las firmas de episodios. No nos dijiste cuántos episodios hay en cada temporada, pero obviamente necesitas saberlo. Así es como preparas el archivo:

    >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
    

    Esto supone que cada temporada comienza con su propio episodio número uno (su pregunta no está clara al respecto). El archivo consta de líneas en un formulario S<n>-E<m>, por ejemplo S2-E3.

  2. Cree un archivo de episodios propios de la misma forma:

    cut -d - -f -2 your_current_list >owned_episodes

    El comando toma -como d línea de elimiter fragmenta y vuelve hasta la f número ield 2 desde la lista actual.

  3. Tratar owned_episodescomo patrones y filtrar all_episodespara encontrar líneas sin ningún patrón:

    grep -vxFf owned_episodes all_episodes

    Tenga en cuenta que usamos -xaquí; El punto es S50-E3que no debería coincidir S50-E31. -Fno es necesario en su caso, pero en general uno debe usarlo mientras suministra cadenas fijas. Las opciones son:

    -F
    Emparejar con cuerdas fijas. Trate cada patrón especificado como una cadena en lugar de una expresión regular. [...]

    -f pattern_file
    Lea uno o más patrones del archivo nombrado por el nombre de ruta pattern_file. [...]

    -v
    Seleccione líneas que no coincidan con ninguno de los patrones especificados. [...]

    -x
    Considere solo las líneas de entrada que usan todos los caracteres en la línea, excluyendo la terminación <newline>para que coincida con una cadena fija completa o expresión regular para que sean líneas coincidentes.

Kamil Maciorowski
fuente