フォルダ内に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
は時間です。
フォルダにないファイルを見つける方法は?私はグーグルでほとんど答えを得ませんでしたが、それらを実装する方法を理解することができませんでした。
zsh
またはbash4
を使用すると、 中括弧の展開 を使用できます。
ls -d GLDAS_NOAH025SUBP_3H.A2003{001..006}.{0000,0600,1200,1800}.001.2015210044609.pss.grb >/dev/null
角かっこに注意してください。
{001..006}
は、001
、002
、... 006
に展開することを意味します{0000,0600,1200,1800}
を追加し、0000
、0600
、1200
、および1800
を追加します。>/dev/null
はls
の標準出力を回避するためのものです->標準エラーのみが必要ですこれで、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}
に置き換えます。
@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
欠落している日と時間のみを印刷するには
カオスの答え はインタラクティブシェルで使用するのに適していますが、これは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で指定されていません。)
ループ内でファイル名を作成してから、ファイルが存在しないかどうかをテストします。
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
注:この例にエラーがないことを保証するものではありません。これは一例であり、動作することがわかっているスクリプトではありません。
移植性:ksh
、bash
、またはzsh
と、GNU seq
コマンドが使用可能なシステムが必要です。