
Tenho uma grande lista de arquivos com nomes (vídeos)
Consegui escrever todos os nomes de arquivos em um arquivo de texto. Agora eu tenho um arquivo de texto com vários nomes de arquivos (um episódio por linha) Agora preciso de algo que possa ler esse arquivo de texto e me dizer qual E
número do episódio está faltando
S1-E18-(Date)-(Title)-(Random numbers).mp4
Aqui está um exemplo de uma 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
Neste caso é fácil ver que os arquivos S1-E2
estão S10-E4
faltando. mas se eu tiver uma lista grande, como posso encontrar os arquivos ausentes? (Deixe o número da temporada S1, S2
) só preciso verificar E
o número do episódio
O maior número do arquivo existente é S50-E2184
e O menor número do arquivo existente éS1-E1
Responder1
Salve todos os nomes em um arquivo com o nome "file_with_list_of_files" e execute o comando abaixo em um terminal linux/unix [tentei no terminal mac]:
cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"
-- ou --
cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"
Isso lista todos os nomes de arquivos que não possuem um E após o primeiro - (hífen). Você também pode encontrar outras maneiras melhores de fazer isso.
Responder2
Prepare um arquivo com todas as assinaturas dos episódios. Você não nos contou quantos episódios existem em cada temporada, mas obviamente precisa saber. É assim que você prepara o arquivo:
>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
Isso pressupõe que cada temporada comece com seu próprio episódio número um (sua pergunta não está clara sobre isso). O arquivo consiste em linhas em um formato
S<n>-E<m>
, por exemploS2-E3
.Crie um arquivo de episódios próprios no mesmo formato:
cut -d - -f -2 your_current_list >owned_episodes
O comando toma
-
comodeliminador e retorna fragmentos de linha até ofcampo número 2 da sua lista atual.Trate
owned_episodes
como padrões e filtreall_episodes
para encontrar linhas sem nenhum padrão:grep -vxFf owned_episodes all_episodes
Observe que usamos
-x
aqui; a questão é queS50-E3
não deveria corresponderS50-E31
.-F
não é necessário no seu caso, masem geraldeve-se usá-lo ao fornecer strings fixas. Oopçõessão:-F
Combine usando strings fixas. Trate cada padrão especificado como uma string em vez de uma expressão regular. [...]-f pattern_file
Leia um ou mais padrões do arquivo nomeado pelo pathnamepattern_file
. [...]-v
Selecione linhas que não correspondam a nenhum dos padrões especificados. [...]-x
Considere apenas as linhas de entrada que usam todos os caracteres da linha, excluindo a terminação,<newline>
para corresponder a uma string fixa inteira ou expressão regular para serem linhas correspondentes.