Como imprimir o nome dos arquivos ausentes em uma pasta?

8

Eu tenho mais de 2000 arquivos em uma pasta, mas há poucos arquivos ausentes na pasta.

O nome dos arquivos é como

GLDAS_NOAH025SUBP_3H.A2003 001,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001,1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002,1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003,0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1800 .001.2015210044609.pss.grb

001indica dia, enquanto 0000é a hora.

Como descobrir qual arquivo está faltando na pasta? Eu tenho poucas respostas no google, mas não consegui descobrir como implementá-las.

Maria
fonte
Você quer dizer que todos os dias de 001 a xyz deve haver 4 arquivos: 0000, 0600, 1200 e 1800? E se não, esse nome deve ser impresso? Entendo isso correto?
caos
No * nix, nós os chamamos de 'diretórios', não de pastas. Pastas é um termo do Windows.
29415 Rob
1
@ Chaos é 001 a 365 e sim, você entendeu meu ponto.
Maria
3
@Rob: meh. Ambos os termos são muito bem compreendidos. Na verdade, a Apple provavelmente criou a metáfora da pasta na época do primeiro lançamento do MacOS, antes mesmo que o MS Windows existisse. E já que como todos nós MacOS saber é UNIX, que faz pasta um termo UNIX :-)
Celada
2
Pasta e diretório são metáforas muito diferentes, no entanto. E os diretórios no Unix se comportam como diretórios da vida real e diferentemente das pastas da vida real, enquanto as pastas do Windows se comportam muito mais como pastas da vida real do que com diretórios da vida real, portanto, faz sentido usar o termo que mais próximo assemelha-se ao conceito da vida real correspondente. Eu pessoalmente vi a perda de dados causada por um usuário pensar que os diretórios se comportavam como pastas porque seus professores continuavam chamando-os de pastas em vez de diretórios.
Jörg W Mittag

Respostas:

13

Com zshou bash4, você pode usar a expansão de chaves para isso:

ls -d GLDAS_NOAH025SUBP_3H.A2003{001..006}.{0000,0600,1200,1800}.001.2015210044609.pss.grb >/dev/null

Observe os colchetes:

  • {001..006}meios expandir para 001, 002...006
  • {0000,0600,1200,1800}a todos os itens acima 0000, adicione 0600, 1200e 1800.
  • >/dev/nullé evitar a saída padrão de ls-> queremos apenas erro padrão

Agora, se um arquivo não estiver presente, lsserá exibido um erro para isso:

ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003004.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003005.1800.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0000.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.0600.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1200.001.2015210044609.pss.grb: No such file or directory
ls: cannot access GLDAS_NOAH025SUBP_3H.A2003006.1800.001.2015210044609.pss.grb: No such file or directory

Com ksh93, substitua {001..006}por {1..6%.3d}.

caos
fonte
2
Legal .... + 1!
31415 João
Obrigado, mas há 365 dias, portanto, {001..006} não pode ser expandido nessa extensão no comando. O que fazer para isso?
Maria
3
@Maria Por que não, você já tentou {001..365}, para mim ele funciona
caos
1
Veja também o {0000..1800..600}formulário.
Stéphane Chazelas
Você realmente não precisa dos minutos da lista. A segunda expansão de braçadeira poderia ser apenas .{00,06,12,18}00..
WAF
7

Uma variação na solução @chaos (bash 4.0 ou superior ou zsh 4.3.11 e superior):

for a in GL.....2003{001..365}.{00..18..6}00.001.2015210044609.pss.grb 
do  
  [[ -f $a ]] || echo "$a"
done

ou

for a in {001..365}.{00..18..6}
do
  [[ -f "GL.....2003${a}00.001.2015210044609.pss.grb" ]] || echo "$a"
done

imprimir apenas o dia + hora que falta

JJoao
fonte
4

Embora a resposta do caos seja boa para ser usada em shells interativos, essa pode ser usada como um script POSIX, por exemplo, se você precisar fazer isso periodicamente e / ou em outros computadores.

#!/bin/sh
i=0
while test "$((i+=1))" -lt 366 ; do
    for j in 00 06 12 18 ; do
        file="GLDAS_NOAH025SUBP_3H.A2003$(printf '%03d' "$i").${j}00.001.2015210044609.pss.grb"
        test -e "$file" || echo "$file"
    done
done

( seqou a expansão entre chaves não é especificada pelo POSIX.)

MichalH
fonte
2

Crie os nomes dos arquivos em um loop e teste a inexistência de um arquivo:

for day in `seq -f "%03g" 1 30`
  do
  for hour in 0000 0600 1200 1800
    do
    filename="GLDAS_NOAH025SUBP_3H.A2003${day}.${hour}.001.2015210044609.pss.grb"
    if [[ ! -e $filename ]]
    then
      echo "File missing: $filename"
    fi
  done
done

Nota: Não garanto que este exemplo esteja livre de erros. É um exemplo, não um script de trabalho conhecido.

Portabilidade: necessidades ksh, bashou zshe um sistema com o GNU seqcomando disponíveis.

John
fonte
O conceito é o que eu convergi também, mas observe que pouquíssimos meses julianos têm 30 dias.
WAF