2012-10-26 7 views
6

ご協力いただきありがとうございます!ディレクトリ内のすべてのフォルダのBash-for-loop(一部を除く)

私はbashでこのコードを持っている:魔法のように動作

for d in this_folder/*  
    do  
     plugin=$(basename $d) 
     echo $plugin'?' 
     read $plugin 
    done 

。 'this_folder'の中のすべてのフォルダについて、それを質問としてエコーし、同じ名前の変数に入力を格納します。

しかし、私はいくつかのフォルダを除外したいと思っています。たとえば、そのディレクトリ内のすべてのフォルダを尋ねます。グローバル、プラグイン、およびcssのいずれのフォルダでもない場合に限ります。

どのように私はこれを達成することができますか?

ありがとうございます!

UPDATE:あなたはディレクトリのリストを構築し、結果を変数に格納するfindawkを使用することができます

base="coordfinder|editor_and_options|global|gyro|movecamera|orientation|sa" 

> vt_conf.sh 
echo "# ========== Base"  >> vt_conf.sh 
for d in $orig_include/@($base) 
do 
    plugin=$(basename $d) 
    echo "$plugin=y"   >> vt_conf.sh 
done 
echo ''      >> vt_conf.sh 
echo "# ========== Optional" >> vt_conf.sh 
for d in $orig_include/!($base) 
do 
    plugin=$(basename $d) 
    echo "$plugin=n"   >> vt_conf.sh 
done 

答えて

6

あなたはbashの最近のバージョンを使用している場合は、あなたが使用することができ、拡張グロブ(shopt -s extglob):

for d in this_folder/!(global|plugins|css)/ 
do  
    plugin=$(basename "$d") 
    echo $plugin'?' 
    read $plugin 
done 
+0

これは非常に良い選択ですが、 'this_folder'にディレクトリとファイルの両方がある場合はすべてのファイルも返します。 'for'行の末尾に('! 'の後に)末尾に '/'を付けると、これはきれいに動作します。 また、(あなたとOPに)引用符で囲まれた '$ d 'への参照を囲むことをお勧めします。これはスペースでファイル指定をカバーすることができます。 –

+1

@CharlesRobertoCanato:良いアドバイス、私はあなたの提案を追加しました – Thor

-1

これは次のように最終的なコードがどのように見えるかです。この線に沿って何か(未テスト):

dirs=$(find this_folder -maxdepth 1 -type d -printf "%f\n" | awk '!match($0,/^(global|plugins|css)$/)') 
for d in $dirs; do 
    # ... 
done 
+0

一致空白またはシェルのワイルドカード文字を含むファイル名がある場合、これは壊れる既存のファイル。 – tripleee

7

あなたはループの1回の繰り返しスキップするcontinueを使用することができます:あなたはグローバル、CSSという名前のディレクトリのみを除外することを意味している場合

for d in this_folder/*  
    do  
     plugin=$(basename $d) 
     [[ $plugin =~ ^(global|plugins|css)$ ]] && continue 
     echo $plugin'?' 
     read $plugin 
    done 
1

を、プラグイン。これは優雅な解決策ではないかもしれませんが、あなたが望むことをするでしょう。

for d in this_folder/*  
do 
    flag=1 
    #scan through the path if it contains that string 
    for i in "/css/" "/plugins/" "/global/" 
    do 

    if [[ $(echo "$d"|grep "$i") && $? -eq 0 ]] 
    then 
     flag=0;break; 
    fi 
    done 

    #Only if the directory path does NOT contain those strings proceed 
    if [[ $flag -eq 0 ]] 
    then 
    plugin=$(basename $d) 
    echo $plugin'?' 
    read $plugin 
    fi 


done 
+1

'flag = 0; break;の代わりに、' continue 2'だけ使うことができます。後で 'if [[$ flag -eq 0]] ... 'ラッパーを削除します。 – dubiousjim

+0

@dubiousjim:うん、そうだけど、私はOPを理解するためにスクリプトを簡単にしたかった。 – askmish

関連する問題