web-dev-qa-db-ja.com

ディレクトリではなく、すべてのファイルを削除するコマンドは何ですか?

次のようなディレクトリツリーがあるとします。

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

rm -r FOLDER/*を使用した場合、サブフォルダーを含むFOLDERのすべてが削除されます。実際のディレクトリを削除せずに、FOLDERおよびそのサブディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?

22
PKM

あなたがしようとしているのは、再帰的な削除です。そのためには、findなどの再帰ツールが必要です。

find FOLDER -type f -delete
36

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/**/*(.)
13
heemayl

findのバージョンが-deleteをサポートしていない場合、以下を使用して現在のディレクトリ以下のすべてのファイルを削除できます。

find . ! -type d -exec rm '{}' \;
11
user508889