Encontrar números faltantes

Encontrar números faltantes

Tengo una gran lista de archivos con nombres (videos)

Logré escribir todos los nombres de archivos 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

A continuación se muestra 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-E4pero si tengo una lista grande, ¿cómo puedo encontrar los archivos que faltan? (Deje el número de temporada S1, S2) solo necesita verificar Eel número de episodio

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

Respuesta1

Guarde todos los nombres en un archivo con el nombre "file_with_list_of_files" y ejecute el siguiente comando en una terminal Linux/Unix [lo probé en una 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 archivos que no tienen una E después del primero - (guión). Es posible que también encuentre otras formas mejores de hacerlo.

Respuesta2

  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 es 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 -comodelimina y devuelve fragmentos de línea hasta elFcampo número 2 de su lista actual.

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

    grep -vxFf owned_episodes all_episodes
    

    Tenga en cuenta que utilizamos -xaquí; El punto es que S50-E3no debería coincidir S50-E31. -FNo es necesario en tu caso peroen generalse debe utilizar mientras se suministran cadenas fijas. Elopcionesson:

    -F
    Emparejar usando 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 la 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 de la línea, excluyendo la terminación, <newline>para que coincidan con una cadena fija completa o una expresión regular para que coincidan con las líneas.

información relacionada