web-dev-qa-db-ja.com

最初の親ディレクトリではなく、サブディレクトリとファイルを再帰的に削除するにはどうすればよいですか?

次を使用して、ターゲットディレクトリと、そのすべてのサブディレクトリおよびコンテンツを再帰的に削除できます。

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

ただし、ターゲットディレクトリを削除したくありません。ターゲット内のファイル、サブディレクトリ、およびそれらのコンテンツのみを削除するにはどうすればよいですか?

13

前の答えはほぼ正しいです。ただし、動作させる場合は Shell glob characters を引用符で囲まないでください。だから、これはあなたが探しているコマンドです:

rm -rf "/target/directory with spaces/"*

*は二重引用符の外側にあることに注意してください。このフォームも機能します:

rm -rf /target/directory\ with\ spaces/*

上記のように*が引用符で囲まれている場合、ターゲットディレクトリ内の文字どおり*という名前の単一のファイルのみが削除されます。

11
pioto

さらに3つのオプション。

  1. find-mindepth 1および-deleteとともに使用します。

    −心深さレベル
    レベル(負でない整数)未満のレベルでテストまたはアクションを適用しないでください。
    − mindepth 1は、コマンドライン引数を除くすべてのファイルを処理することを意味します。

    -削除
    ファイルを削除します;削除が成功した場合はtrue。削除が失敗した場合、エラーメッセージが発行されます。 −deleteが失敗すると、findの終了ステータスはゼロ以外になります(最終的に終了するとき)。 −deleteを使用すると、−depthオプションが自動的にオンになります。
    このオプションを使用する前に、-depthオプションを使用して慎重にテストしてください。

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2。 findを使用しますが、ディレクトリではなくファイルを使用します。これにより、rm -rfが不要になります。

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3。先に進んで親ディレクトリを削除しますが、再作成します。 1つのコマンドでこれを行うbash関数を作成できます。ここに簡単なワンライナーがあります:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'
8
quack quixote
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
2
Sergey