2016-08-10 13 views
0

私はスクリプティング/プログラミング/すべてを初心者にしており、このbashスクリプト/ループを理解できないようだが、私は反復しようとしている。bashのforループは正しく反復されませんか?

Iは、各私は(今のところ)エコーしたいファイルを、私はこれを持って

が含まれている多くのサブディレクトリが存在し、「フォルダ」というディレクトリを持っているが、印刷していないようですサブディレクトリ内にファイルを作成する代わりに、サブディレクトリ自体を出力します。このスクリプトを変更するにはどうすればよいでしょうか?

for directory in *; 
do 
     for thing in $directory 
     do 
       echo $thing 
     done 
done 
+2

あなたは' $ {ディレクトリ} /したくないですか?またはperphaps '(cd" $ directory "; *の中のものはecho $ thing; done;)'です。 – Droppy

答えて

3

forループ自体はファイルシステムを通過しません。一連の文字列に対してのみ反復処理を行います。 2番目のループのパス名展開の結果を反復処理する必要があります。

for directory in *; 
do 
    for thing in "$directory"/* 
    do 
     echo "$thing" 
    done 
done 

あなたは、より複雑なパターンを持つ一つのループでこれを行うことができます:* `

for thing in */*; do 
    echo "$thing" 
done 
+0

no loopによって、 'some_command */*'のようなものを意味しますか?私は内側のループの本体が単一の組み込みコマンドよりも複雑であると仮定しています。この場合、これは大規模なマッチのセットに問題があります。 – chepner

1

Bashのバージョン4.0は、それが設定されています異なったパターン**を扱うglobstarと呼ばれる新しいグロブオプションが追加されます。

#!/bin/bash 
shopt -s globstar 
for file in folder/** # with '**' bash recurses all the directories 
do 
    echo "$file" 
done 
+1

アレイは無関係であり、おそらくメモリ上のドレインです。あなたはパターンを直接反復することができます。これは完全一致をメモリに格納する必要はありません。 – chepner

+0

@chepner:よく指摘されています!変更されました – sjsam

関連する問題