2016-05-20 7 views
0

いくつかのディレクトリに異なる種類のファイル(拡張子が異なる)がある状況があります。特定のディレクトリにどのような種類のファイルが存在するかはわかりません。のは、次のような場合を想定してみましょう:拡張子に応じてファイルを解析する方法

/dir1/dir2/dir3/1/ 
/dir1/dir2/dir3/2/ 
/dir1/dir2/dir3/3/ 
/dir1/dir2/dir3/4/ 
/dir1/dir2/dir3/5/ 
要するに

、1、2、3、4、5、次のとおりです。

5つのすべてのディレクトリ1、2、3、4、5への共通パスが通りがありますdir3で。

例として、
ディレクトリ1と3は、
.txtのディレクトリ2、4、5は、私は今のようにこれをやっている拡張子.gzを

を持つファイルを持っている拡張子を持つファイルを持っています:

while [ $a -le 5 ] 
    do 
     cat /dir1/dir2/dir3/"$a"/*.txt | grep "string" > /path/output"$a" 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" > /path/output"$a" 
     ((a++)) 
    done 

出力は作成されますが、空白はほとんどありません。入力には私がgrepで使用した文字列が含まれていると確信しています。私は使用しているスクリプトがファイルを上書きしていると思います。

ファイル拡張子を最初に検索し、それに応じてcatまたはzcatを実行すると、これを実行するにはどうすればよいですか?提案してください?

編集:

私も次のことを試してみた:

while [ $a -le 5 ] 
    do 

for f in /dir1/dir2/dir3/"$a"/*.txt 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 
for f in /dir1/dir2/dir3/"$a"/*.gz 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 

done 
+0

編集した試行は、 'shopt -s nullglob'を使用する限り有効です。これは、一方または他方の 'for'ループがまったく入力されないようにします。どんな理由であれ、同じディレクトリにある 'gz'と' txt'ファイルで終わると、 'gz'ループの結果は' txt'ループの結果を上書きします。 – chepner

+0

@chepnerはい。出力を別のディレクトリにリダイレクトするとうまくいきます.1つは.txt、もう1つは.gzです。 – intruder

答えて

1

は1つのアレイ内のすべてのtxtファイルを収集し、その配列が空でない場合は、catを実行します。それ以外の場合は、zcatを実行します。実際に実行されたファイルの出力は、出力ファイルにリダイレクトされます。

shopt -s nullglob 
for d in 1 2 3 4 5; do 
    txt=(/dir1/dir2/dir3/"$d"/*.txt) 
    if ((${#txt[@]})); then 
     grep "string" "${txt[@]}" 
    else 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" 
    fi > /path/output/"$d" 
done 
関連する問題