Se eu dou ls -1
eu recebo assim,
file_0001.jpeg
file_0002.jpeg
file_0003.jpeg
file_0004.jpeg
file_0005.jpeg
file_0006.jpeg
file_0007.jpeg
file_0008.jpeg
file_0009.jpeg
file_0010.jpeg
file_0011.jpeg
file_0012.jpeg
file_0013.jpeg
file_0014.jpeg
file_0015.jpeg
file_0016.jpeg
file_0017.jpeg
file_0018.jpeg
file_0019.jpeg
file_0020.jpeg
file_0021.jpeg
...
file_0999.jpeg
Existe uma maneira de usar awk
ou outra ferramenta para ver se algum arquivo está faltando dessa maneira incremental consecutiva.
Se você estiver usando o
bash
shell, poderá usarseq
oujot
para criar uma amostra de referência de saída "perfeita" e comparar a saída dels -1
com essa referência:Isso não apenas mostrará os arquivos ausentes, mas também encontrará arquivos estranhos.
Enquanto as outras respostas fornecem maneiras de encontrar exatamente quais arquivos estão faltando, a questão original de ver se algum arquivo está faltando pode ser verificada de uma maneira mais fácil de digitar.
Sua lista é a saída de
ls -1
, portanto, canalizá-la para wc deve fornecer vários arquivos correspondentes ao nome da última entrada.ls -1 | wc -l
Se a contagem não corresponder ao nome do último arquivo, deve haver um arquivo ausente.
Você pode usar o Awk para filtrar os ausentes. No GNU Awk, com suporte para multi-char FS, você pode canalizar seu resultado para
Ou usando
perl
Se houver mais lacunas previstas, você pode
awk
imprimir o intervalo de números de arquivos ausentes. Modificando o acimaVocê pode filtrar com
comm
.Por exemplo, enquanto estiver em um diretório com esses arquivos com alguns ausentes:
Você pode filtrar assim:
comm
é um comando para comparar 2 arquivos, mostrando quais linhas estão presentes apenas no arquivo 1, quais estão apenas no arquivo 2 e quais estão em ambos.-1
suprime as linhas presentes apenas no arquivo 1,-2
suprime as linhas presentes apenas no arquivo 2 e-3
suprime as linhas presentes em ambos.-13
é o mesmo que-1 -3
, que suprime todas as linhas, exceto aquelas que estão presentes apenas no arquivo 2, os nomes dos arquivos gerados.Arquivos estranhos no diretório podem ser listados usando
-23
em vez de-13
:Não usando essas opções, pode-se ver tudo diferenciado por recuo. As linhas apenas no arquivo 1 não têm recuo, as linhas apenas no arquivo 2 têm recuo de 1 tabulação e as linhas presentes em ambos têm recuo de 2 tabulações:
Use um laço for.
Como um roteiro
uma maneira fácil de fazer isso é fazer um loop sobre os números do
seq
comandoapenas adapte ao seu formato de 4 números em seus próprios nomes de arquivos
(Acontece que esta pergunta era uma duplicata, e o que eu uso é o mesmo que a resposta principal em Como imprimir o nome dos arquivos ausentes em uma pasta? )
Para uso interativo em bash , rápido e fácil de digitar e lembrar:
eu normalmente uso
{01..99}
expansão de chaves para gerar a série esperada e procurarls
erros:O redirecionamento oculta a lista stdout dos arquivos existentes, mas o stderr permanece conectado ao terminal. Às vezes, deixo de fora
>/dev/null
e apenas rolo de volta no terminal se houver menos de ~ 100 arquivos, porque as mensagens de erro aparecem primeiro, enquantols
ainda está lendo seus argumentos antes de classificá-los e imprimi-los. Isso também verifica se eu digitei certo e meu padrão está correspondendo aos arquivos que eu queria (especialmente se incluir um glob).Para piping / capture, você pode
foo=$(ls ... 2>&1 >/dev/null)
redirecionar stderr para o pipe e, em seguida, redirecionar stdout para /dev/null enquanto deixa stderr indo para o pipe do shell. Isso seria útil para verificar a saída de erro vazia/não vazia. Mas em um script, se você deseja obter os nomes dos arquivos ausentes, procure outras respostas em vez de tentar analisá-lo a partir dels
mensagens de erro que podem ser internacionalizadas etc.Se você quiser / se necessário, você pode usar aspas em outras partes do nome do arquivo, como
'foo bar '{01..22}.jpg
. Ou até mesmofoo\ bar\ {01..22}*.jpg
para expandir para'foo bar '01*.jpg
/'foo bar '02*.jpg
etc, para que funcione mesmo se houver algum nome exclusivo extra para alguns ou todos os arquivos em algum lugar diferente dos números de sequência.Isso funciona mesmo que sua numeração não use zeros à esquerda, por exemplo,
{1..99}
em vez de{01..99}
. Se você quiser incluir zeros à esquerda dentro do intervalo de chaves, você pode fazer coisas como{01..09}
o que funciona da maneira que você espera, em vez de fatorá-los para fora da expressão de chaves, como fiz no exemplo.Observe que os sistemas Linux modernos suportam listas de argumentos muito longas, como 128kiB de texto . Esse método depende da geração de uma linha de comando com cada arquivo nela. Isso é 100% bom para uso interativo: no caso raro em que a lista é muito grande, o shell informará sobre isso.
Outra resposta usou um
for
loop sobre a lista, que seria mais lento (iniciando um separadols
para cada arquivo), mas seguro mesmo no enorme, ou em um sistema mais limitado com limites de argv muito menores.