web-dev-qa-db-ja.com

フォルダ内の不足しているファイルの名前を印刷するにはどうすればよいですか?

フォルダ内に2000以上のファイルがありますが、フォルダから欠落しているファイルはほとんどありません。

ファイルの名前は次のようなものです

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は日を示し、0000は時間です。

フォルダにないファイルを見つける方法は?私はグーグルでほとんど答えを得ませんでしたが、それらを実装する方法を理解することができませんでした。

8
Maria

zshまたはbash4を使用すると、 中括弧の展開 を使用できます。

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

角かっこに注意してください。

  • {001..006}は、001002、... 006に展開することを意味します
  • 上記のすべてに{0000,0600,1200,1800}を追加し、000006001200、および1800を追加します。
  • >/dev/nulllsの標準出力を回避するためのものです->標準エラーのみが必要です

これで、1つのファイルが存在しない場合、lsはそのエラーを表示します。

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

ksh93を使用して、{001..006}{1..6%.3d}に置き換えます。

13
chaos

@chaosソリューションのバリエーション(bash4.0以降またはzsh4.3.11以降):

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

または

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

欠落している日と時間のみを印刷するには

7
JJoao

カオスの答え はインタラクティブシェルで使用するのに適していますが、これはPOSIXスクリプトとして使用できます。たとえば、これを定期的に実行したり、別のコンピューターで実行したりする必要がある場合などです。

#!/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または中括弧の展開はPOSIXで指定されていません。)

4
MichalH

ループ内でファイル名を作成してから、ファイルが存在しないかどうかをテストします。

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

注:この例にエラーがないことを保証するものではありません。これは一例であり、動作することがわかっているスクリプトではありません。

移植性:kshbash、またはzshと、GNU seqコマンドが使用可能なシステムが必要です。

2
John