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


23

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

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

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

回答:



13

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

2
zshグロビングの場合は+1。より多くの人々が、zshでできる素晴らしいことを知っておく必要があります。
marcelm

11

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

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

-exec rm {} +特にファイルが多い場合は高速になります。
ムル

また、find . ! -type d -exec rm {} +symリンクも削除します。
モニカの正義

1
@muru:の特定の実装がfindサポートし-deleteていない場合、おそらくサポート-exec ... {} +もしていません。これに対処するための推奨される方法はfind ... -print0 | xargs -r0 rm(多くの潜在的な一致が予想される場合)です。
デビッドフォースター

5
@DavidFoersterはそうではありません。-exec ... {} +POSIXですが、そうで-deleteはありません。(どちらもしない-print0方法によって、)
muru

@muru:結構です。findサポートされている-print0がサポートされていない、少なくとも2つの非POSIX 実装に遭遇しました-exec ... {} +(覚えて-deleteいません)。1つはOS X上にあり、もう1つはSolaris上にありました(数年前、非常に保守的に更新されたシステム上)。また、置き換えることができ-print0-printf '%p\0'。とにかく、これはUnixとLinuxではなくAsk Ubuntuであり、Ubuntuは永遠にGNU findを使用しています。
デビッドフォースター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.