
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é E
nú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-E2
y . S10-E4
pero si tengo una lista grande, ¿cómo puedo encontrar los archivos que faltan? (Deje el número de temporada S1, S2
) solo necesita verificar E
el número de episodio
El número del archivo existente más grande es S50-E2184
y 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
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 ejemploS2-E3
.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.Trate
owned_episodes
como patrones y filtreall_episodes
para encontrar líneas sin ningún patrón:grep -vxFf owned_episodes all_episodes
Tenga en cuenta que utilizamos
-x
aquí; El punto es queS50-E3
no debería coincidirS50-E31
.-F
No 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 rutapattern_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.