Como imprimir o nome dos arquivos perdidos 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.A2003001.0000.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003001.0600.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003001.1200.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003001.1800.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.0000.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.0600.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.1200.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003002.1800.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0000.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.1200.001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.1800.001.2015210044609.pss.grb

001 indica 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.

    
por Maria 29.07.2015 / 14:44

4 respostas

13

Com zsh ou 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 parênteses:

  • {001..006} significa expandir para 001 , 002 , ... 006
  • {0000,0600,1200,1800} para cada um dos acima, adicione 0000 , 0600 , 1200 e 1800 .
  • >/dev/null é para evitar a saída padrão de ls - > só queremos erro padrão

Agora, se um arquivo não estiver presente, ls mostrará 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} .

    
por 29.07.2015 / 15:03
7

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

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

para imprimir apenas o dia e a hora que faltam

    
por 29.07.2015 / 15:27
4

Embora a resposta do caos seja boa para ser usada em shells interativos, esta pode ser usada como um script POSIX , por exemplo, se você precisar fazer isso periodicamente e / ou fazê-lo 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

( seq ou expansão de chave não são especificados por POSIX.)

    
por 29.07.2015 / 23:05
2

Compile 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 conhecido.

Portabilidade: precisa de ksh , bash ou zsh e um sistema com o comando GNU seq disponível.

    
por 29.07.2015 / 14:54