2011-09-19 24 views
12

の失敗:内のファイルがある場合、正常に動作しますバッシュスクリプト、フォルダ内のファイルをループは、私は、このbashスクリプトコードでフォルダ内の(すべてのファイルがMOVIEで始まる)特定のファイルをループしてる

for i in MY-FOLDER/MOVIE* 
do 

フォルダ。しかし、何もないときは、何とかMY-FOLDER/MOVIE *という名前の1つのファイルが続きます。

どのように私は、フォルダ内のすべてのファイルが存在しない場合

do 

後のものを入力するようにそれを避けることができますか?

答えて

11
for i in $(find MY-FOLDER/MOVIE -type f); do 
    echo $i 
done 

findユーティリティは、Linuxのスイスアーミーナイフの一つです。あなたが指定したディレクトリから開始し、指定したオプションに従って、すべてのサブディレクトリ内のすべてのファイルを検索します。

-type fは、通常のファイル(ディレクトリではない)のみを検索します。

私が書いたように、このコマンドではサブディレクトリにもファイルがあります。あなたはそれを防ぐことができます追加することによってそれを防ぐことができます

+1

検索はスイス軍ナイフです、本当です。そのような方法で使用すると、forループはスペースを含むファイルに失敗する傾向があります。 –

+1

さらに、これは 'echo $ i'で分割されます。より良い構文の例については、[this](http://stackoverflow.com/a/7039579/3076724)を参照してください。 – BroSlow

13

nullglobオプションです。

$ shopt -s nullglob 
$ for i in zzz* ; do echo "$i" ; done 
$ 
+0

あなたのコードは 'nullglob'オプションなしでも私のために働く、何が間違っている? –

+0

@DenisGolomazov:一致するファイルがあります。ファイルと一致しないglobを使用してみてください。 –

+0

ありがとう、それを得た。結果は 'zzz *'でした。 –

3
 
for file in MY-FOLDER/MOVIE* 
do 
    # Skip if not a file 
    test -f "$file" || continue 
    # Now you know it's a file. 
    ... 
done 
関連する問題