0

私の質問は、単純にタスクを完了するというよりも、コードの効率と単純さに関する質問です。シナリオは次のとおりです。各ユーザーのホーム ディレクトリにあるときに、for ループを使用して /Users を反復処理する bash スクリプトを作成したいと思います。2 つの異なるディレクトリが次のスタイルで存在するかどうかを確認します。

for USER in /Users/*; do
    if [ -d "$USER/Library/Caches/com.spotify.Client" ]; then 
        rm -rf "$USER/Library/Caches/com.spotify.Client"

...しかし、複数のディレクトリを確認する必要があります。最もエレガントな方法でこれを達成するにはどうすればよいですか? 一連の if ステートメントの使用を避けたいのですが、これを達成する最善の方法がわかりません。

最後に、find コマンドを使用してファイルを検索し、検索の結果 (つまり、見つかったファイルへのパス) を変数に設定し、それを別のコマンドに入力したいと考えています。ありがとうございました。

4

2 に答える 2

2

あなたの要件を理解していることから、forループをネストします。

subdirs=(
    "Library/Caches/com.spotify.client"
    "some/other/subdir/"
)

for homedir in /Users/*; do
    for subdir in "${subdirs[@]}"; do
        dir="$homedir/$subdir"
        if [[ -d "$dir" ]]; then
            rm -rf "$dir"
        fi
    done
done
于 2012-06-06T02:57:14.197 に答える
1

以下は、上記の@David Woleverの回答に基づいています。これらのバージョンは短く、シェルが前もってより多くのグロブを実行できるようにします。

中間 (配列) 変数を使用しないインラインの単一ループ バージョン:

for dir in /Users/*/'Library/Caches/com.spotify.client/' /Users/*/'some/other/subdir/'; do
    [[ -d "$dir" ]] && rm -rf "$dir"
done

配列変数バージョン:

subdirs=(
    'Library/Caches/com.spotify.client/'
    'some/other/subdir/'
)

for subdir in "${subdirs[@]}"; do
    for dir in /Users/*/"$subdir"; do 
        [[ -d "$dir" ]] && rm -rf "$dir"
    done
done
于 2012-06-06T05:04:06.533 に答える