フォルダ内の不足しているファイルの名前を印刷する方法は?


8

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

ファイルの名前は

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

001日を示し0000、時間を示します。

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


つまり、毎日001からxyzまでには、0000、0600、1200、1800の4つのファイルが必要ですか?そうでない場合は、その名前を印刷する必要がありますか?これは正しいのでしょうか?
2015

* nixでは、フォルダではなく「ディレクトリ」と呼びます。フォルダはWindowsの用語です。
Rob

1
@カオスそれは001から365です&はいあなたは私のポイントを得ました。
マリア

3
@ロブ:ええ。両方の用語はかなりよく理解されています。実際、Appleはおそらく、MS Windowsが存在する前のMacOSの最初のリリースの頃に、フォルダのメタファーを考え出したでしょう。そして、以降に、我々はすべてのMacOSはUNIXの用語フォルダになりUNIX、です:-)知っているように
Celada

2
ただし、フォルダとディレクトリは非常に異なるメタファーです。また、Unixのディレクトリは実際のディレクトリと非常によく似ており、実際のフォルダとは異なりますが、Windowsのフォルダは実際のディレクトリよりも実際のフォルダのように動作するため、この用語をより密接に使用することは理にかなっています対応する現実の概念に似ています。私は個人的に、ユーザーのディレクトリがフォルダのように振る舞うと考えていることによって引き起こされるデータの損失を見ました。彼の教師はディレクトリではなくフォルダと呼んでいるからです。
イェルクWミッターク

回答:


13

zshbash4、あなたが使用することができブレース展開を、そのために:

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}上記の追加の一人一人に0000060012001800
  • >/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}


2
クール.... + 1!
JJoao 2015

ありがとうございますが、365日あるため、コマンドで{001..006}をその範囲まで拡張することはできません。これのために何をしますか?
マリア

3
@Mariaどうして、あなたは試しましたか{001..365}、私にとってそれは機能します
混沌

1
{0000..1800..600}フォームもご覧ください。
ステファンChazelas

リストの議事録は本当に必要ありません。2番目のブレースの拡張はちょうど可能性があります.{00,06,12,18}00.
WAF 2015

7

@chaosソリューションのバリエーション(bash 4.0以降またはzsh 4.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

行方不明の日+時間のみを印刷するには


4

一方で混乱の答えは、インタラクティブシェルで使用するには良いですが、あなたが定期的にこれを行う、および/または別のコンピュータ上でそれを実行する必要がある場合、これは例えば、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で指定されていません。)


2

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

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利用できるコマンド。


コンセプトは私が収束したものでもありますが、30日を持っているユリウス暦の月はほとんどないことに注意してください。
WAF、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.