AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 672996
Accepted
Eduard Florinescu
Eduard Florinescu
Asked: 2021-10-13 23:53:15 +0800 CST2021-10-13 23:53:15 +0800 CST 2021-10-13 23:53:15 +0800 CST

Como posso ver se um arquivo de nome de número consecutivo está faltando algum arquivo? [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
Como encontrar arquivos ausentes com nomes sequenciais? [duplicado] (4 respostas)
Como imprimir o nome dos arquivos ausentes em uma pasta? (4 respostas)
Fechado no ano passado .

A comunidade revisou se deveria reabrir esta pergunta há 10 meses e a deixou fechada:

Duplicar Esta pergunta foi respondida, não é única e não se diferencia de outra pergunta.

Se eu dou ls -1eu 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 awkou outra ferramenta para ver se algum arquivo está faltando dessa maneira incremental consecutiva.

awk utilities
  • 7 7 respostas
  • 1518 Views

7 respostas

  • Voted
  1. Jim L.
    2021-10-14T08:34:48+08:002021-10-14T08:34:48+08:00

    Se você estiver usando o bashshell, poderá usar seqou jotpara criar uma amostra de referência de saída "perfeita" e comparar a saída de ls -1com essa referência:

    $ diff <(ls -1) <(seq -f 'file_%04g.jpeg' 999)
    

    Isso não apenas mostrará os arquivos ausentes, mas também encontrará arquivos estranhos.

    • 12
  2. SE - stop firing the good guys
    2021-10-14T14:28:07+08:002021-10-14T14:28:07+08:00

    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.

    • 12
  3. Best Answer
    Inian
    2021-10-14T00:07:13+08:002021-10-14T00:07:13+08:00

    Você pode usar o Awk para filtrar os ausentes. No GNU Awk, com suporte para multi-char FS, você pode canalizar seu resultado para

    awk -F'[_.]' ' $2 != prev+1 { print "file "  prev+1 " missing" }{ prev = $2 }'
    

    Ou usandoperl

    perl -F'[_.]' -ane 'if ($F[1] != $prev+1) {printf "file %d missing\n",$prev+1}; $prev=$F[1]'
    

    Se houver mais lacunas previstas, você pode awkimprimir o intervalo de números de arquivos ausentes. Modificando o acima

    awk -F'[_.]' ' $2 != prev+1 { print "file(s) "  prev+1 "-" $2-1 " missing" }{ prev = $2 }' file
    
    • 11
  4. JoL
    2021-10-14T08:41:35+08:002021-10-14T08:41:35+08:00

    Você pode filtrar com comm.

    Por exemplo, enquanto estiver em um diretório com esses arquivos com alguns ausentes:

    $ cd "$(mktemp -d)"
    $ touch file_{0001..0999}.jpeg
    $ rm file_0388.jpeg file_0795.jpeg
    

    Você pode filtrar assim:

    $ ls | comm -13 - <(printf 'file_%s.jpeg\n' {0001..0999})
    file_0388.jpeg
    file_0795.jpeg
    

    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. -1suprime as linhas presentes apenas no arquivo 1, -2suprime as linhas presentes apenas no arquivo 2 e -3suprime 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 -23em vez de -13:

    $ touch foo.txt bar.txt
    $ ls | comm -23 - <(printf 'file_%s.jpeg\n' {0001..0999})
    bar.txt
    foo.txt
    

    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:

    $ ls | comm - <(printf 'file_%s.jpeg\n' {0001..0999})
    bar.txt
            file_0001.jpeg
    ...
            file_0386.jpeg
            file_0387.jpeg
        file_0388.jpeg
            file_0389.jpeg
            file_0390.jpeg
    ...
            file_0793.jpeg
            file_0794.jpeg
        file_0795.jpeg
            file_0796.jpeg
            file_0797.jpeg
    ...
            file_0998.jpeg
            file_0999.jpeg
    foo.txt
    
    • 5
  5. Abdullah Ibn Fulan
    2021-10-14T00:09:43+08:002021-10-14T00:09:43+08:00

    Use um laço for.

     for i in file_{0000..0999}.jpeg; do if !  test -e "$i" ; then echo "$i doesn't exist"; fi; done
    

    Como um roteiro

    #! /bin/bash
    for i in file_{0000..0999}.jpeg
    do 
    if !  test -e "$i"
    then
    echo "$i doesn't exist"
    fi
    done
    
    • 4
  6. francois P
    2021-10-14T00:02:30+08:002021-10-14T00:02:30+08:00

    uma maneira fácil de fazer isso é fazer um loop sobre os números do seqcomando

    francois@zaphod:/tmp/tata$
     ls
    file_0.txt   file_1.txt   file_2.txt   file_3.txt   file_4.txt   file_60.txt  file_70.txt  file_80.txt  file_90.txt
    file_10.txt  file_20.txt  file_30.txt  file_40.txt  file_50.txt  file_61.txt  file_71.txt  file_81.txt  file_91.txt
    file_11.txt  file_21.txt  file_31.txt  file_41.txt  file_51.txt  file_62.txt  file_72.txt  file_82.txt  file_92.txt
    file_12.txt  file_22.txt  file_32.txt  file_42.txt  file_52.txt  file_63.txt  file_73.txt  file_83.txt  file_93.txt
    file_13.txt  file_23.txt  file_33.txt  file_43.txt  file_53.txt  file_64.txt  file_74.txt  file_84.txt  file_94.txt
    file_14.txt  file_24.txt  file_34.txt  file_44.txt  file_55.txt  file_65.txt  file_75.txt  file_85.txt  file_95.txt
    file_15.txt  file_25.txt  file_35.txt  file_45.txt  file_56.txt  file_66.txt  file_76.txt  file_86.txt  file_96.txt
    file_16.txt  file_26.txt  file_36.txt  file_46.txt  file_57.txt  file_67.txt  file_77.txt  file_87.txt  file_97.txt
    file_17.txt  file_27.txt  file_37.txt  file_47.txt  file_58.txt  file_68.txt  file_78.txt  file_88.txt  file_98.txt
    file_18.txt  file_28.txt  file_38.txt  file_48.txt  file_59.txt  file_69.txt  file_79.txt  file_89.txt  file_99.txt
    file_19.txt  file_29.txt  file_39.txt  file_49.txt  file_5.txt   file_6.txt   file_7.txt   file_8.txt   file_9.txt
    francois@zaphod:/tmp/tata$
     for i in $(seq 0 99) ; do test -f file_$i.txt || echo "file_$i.txt missing" ; done                                    
    file_54.txt missing
    francois@zaphod:/tmp/tata$
    

    apenas adapte ao seu formato de 4 números em seus próprios nomes de arquivos

    • 3
  7. Peter Cordes
    2021-10-16T17:58:52+08:002021-10-16T17:58:52+08:00

    (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 procurar lserros:

    ls file_0{001..999}.jpeg > /dev/null
    

    O redirecionamento oculta a lista stdout dos arquivos existentes, mas o stderr permanece conectado ao terminal. Às vezes, deixo de fora >/dev/nulle apenas rolo de volta no terminal se houver menos de ~ 100 arquivos, porque as mensagens de erro aparecem primeiro, enquanto lsainda 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 de lsmensagens 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é mesmo foo\ bar\ {01..22}*.jpgpara expandir para 'foo bar '01*.jpg/ 'foo bar '02*.jpgetc, 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 forloop sobre a lista, que seria mais lento (iniciando um separado lspara cada arquivo), mas seguro mesmo no enorme, ou em um sistema mais limitado com limites de argv muito menores.

    • 2

relate perguntas

  • remova o número de linhas duplicadas com base na correspondência antes da primeira vírgula

  • anexar linhas após outros arquivos linha por linha

  • Como remover uma única linha entre duas linhas

  • Reorganize as letras e compare duas palavras

  • Embaralhamento de arquivo de várias linhas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve