次のようなディレクトリツリーがあるとします。
FOLDER:
file1
file2
file3
Subfolder1:
file1
file2
Subfolder2:
file1
file2
rm -r FOLDER/*
を使用した場合、サブフォルダーを含むFOLDERのすべてが削除されます。実際のディレクトリを削除せずに、FOLDERおよびそのサブディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?
あなたがしようとしているのは、再帰的な削除です。そのためには、find
などの再帰ツールが必要です。
find FOLDER -type f -delete
bash
の場合:
shopt -s globstar ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done
ここでは、glob展開されたファイル名を反復処理し、ファイルのみを削除します。
上記はドライランです。変更することに満足したら、echo
を削除して実際に削除します。
for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done
最後に、globstar
の設定を解除します。
shopt -u globstar
zsh
で、glob修飾子を活用:
echo -- FOLDER/**/*(.)
(.)
はglob修飾子で、glob展開を通常のファイルのみに制限します。
上記は実際の削除のためにファイル名を出力するだけです:
rm -- FOLDER/**/*(.)
find
のバージョンが-delete
をサポートしていない場合、以下を使用して現在のディレクトリ以下のすべてのファイルを削除できます。
find . ! -type d -exec rm '{}' \;