スクリプトでディレクトリにcd
してから、サブディレクトリ内のいくつかのファイルを除くすべてを削除する必要がありますが、フォルダはそのままにしておきます。保存する必要のあるファイルごとにswitch
/case
sを使用すると役に立ちますか?
理想的には、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
これはどう?
$ find /Users/YourName/Desktop/Test -type f -maxdepth 2 -not -name watch.log -delete
-type
:ファイルのみを検索-maxdepth
:最大で2レベル下がる-not -name
(コンボ):検索からwatch.log
を除外します-delete
:ファイルを削除します最初に-delete
フラグを指定せずに上記のコマンドを試してください。これにより、削除されたはずのファイルのリストが出力されます。
リストに満足したら、コマンドに-delete
を追加し直します。
find
を使用する必要があります:
for i in $(find . -type d)
do
do_stuff "$i"
done
本当にたくさんのディレクトリがある場合は、findの出力をwhile read
ループにパイプすることができますが、ループが別のプロセスにあるため、コーディングが難しくなります。
スペースについては、ディレクトリ名を含む変数を引用符で囲んでください。これにより、名前にスペースが含まれるディレクトリを適切に処理できるようになります。
検索を使用しますか?深さ、ファイルの経過時間(statのように)、パーマなど、いくつかのパラメーターを使用できます。
find . -maxdepth 2