12

よろしくお願いします!

私はbashにこのコードを持っています:

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

これは魅力のように機能します。'this_folder'内のすべてのフォルダーについて、質問としてエコーし、入力を同じ名前の変数に格納します。

ただし、一部のフォルダを除外したいので、たとえば、グローバル、プラグイン、cssのいずれのフォルダでもない場合にのみ、そのディレクトリ内のすべてのフォルダを要求します。

どうすればこれを達成できますか?

ありがとう!

アップデート:

最終的なコードは次のようになります。

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
4

6 に答える 6

16

最近のバージョンの bash を使用している場合は、拡張グロブ ( shopt -s extglob)を使用できます。

shopt -s extglob

for d in this_folder/!(global|plugins|css)/   
do    
    plugin=$(basename "$d")
    echo $plugin'?'
    read $plugin
done
于 2012-10-26T12:59:04.420 に答える
10

を使用continueして、ループの反復を 1 回スキップできます。

for d in this_folder/*    
    do    
        plugin=$(basename $d)
        [[ $plugin =~ ^(global|plugins|css)$ ]] && continue
        echo $plugin'?'
        read $plugin
    done
于 2012-10-26T12:21:00.970 に答える
1

global、css、plugins という名前のディレクトリのみを除外する場合。これはエレガントな解決策ではないかもしれませんが、あなたが望むことをします。

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
于 2012-10-26T12:53:50.820 に答える
0

と を使用findawkてディレクトリのリストを作成し、結果を変数に格納できます。これに沿ったもの(テストされていません):

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

2019-05-16 更新:

while read -r d; do
    # ...
done < <(gfind  -maxdepth 1 -type d -printf "%f\n" | awk '!match($0,/^(global|plugins|css)$/)')
于 2012-10-26T11:47:57.717 に答える