web-dev-qa-db-ja.com

Bashでディレクトリをループする

スクリプトでディレクトリにcdしてから、サブディレクトリ内のいくつかのファイルを除くすべてを削除する必要がありますが、フォルダはそのままにしておきます。保存する必要のあるファイルごとにswitch/casesを使用すると役に立ちますか?

理想的には、2つのレベルだけを検索するネストされたループを使用するのではなく、さらにサブディレクトリを検索し続ける必要があると思います。

もう1つの問題は、スペースのあるフォルダーをスキップすることです(現時点では、これはスクリプトが実行するボリュームの問題ではありません)。

これが私のコードです:

for i in /Users/YourName/Desktop/Test/* ; do
  if [ -d "$i" ]; then
    cd $i

    for j in "$i"/* ; do
      if [ -d "$j" ]; then
        cd $j

        for k in $(ls *); do
          if [ ! $k == "watch.log" ]; then
            echo $k
            rm -rf $k
          fi
        done

      fi
    done

  fi
done
14
infmz

これはどう?

$ find /Users/YourName/Desktop/Test -type f -maxdepth 2 -not -name watch.log -delete


説明

  • -type:ファイルのみを検索
  • -maxdepth:最大で2レベル下がる
  • -not -name(コンボ):検索からwatch.logを除外します
  • -delete:ファイルを削除します


勧告

最初に-deleteフラグを指定せずに上記のコマンドを試してください。これにより、削除されたはずのファイルのリストが出力されます。

リストに満足したら、コマンドに-deleteを追加し直します。

12
Hai Vu

findを使用する必要があります:

for i in $(find . -type d)
do
    do_stuff "$i"
done

本当にたくさんのディレクトリがある場合は、findの出力をwhile readループにパイプすることができますが、ループが別のプロセスにあるため、コーディングが難しくなります。

スペースについては、ディレクトリ名を含む変数を引用符で囲んでください。これにより、名前にスペースが含まれるディレクトリを適切に処理できるようになります。

28
static_rtti

検索を使用しますか?深さ、ファイルの経過時間(statのように)、パーマなど、いくつかのパラメーターを使用できます。

find . -maxdepth 2
2
Aif