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


13

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

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

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

回答:


11

前の答えはほぼ正しいです。ただし、シェルグロブ文字を機能させたい場合は、引用符で囲まないでください。だから、これはあなたが探しているコマンドです:

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

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

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

あなたが持っている場合は*上記のように引用符で、それだけで、文字通りという名前の単一のファイル削除しようとする*ターゲットディレクトリ内を。


1
これは隠しファイルと隠しフォルダでは機能しません。私はもう一度それをしなければなりません
でし

8

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

  1. 使用findして-mindepth 1-delete

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

    -delete
    ファイルを削除します。削除が成功した場合は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'

2

いかがですか

rm -rf /target/directory\ path/*

で始まるファイルがある場合。ターゲットディレクトリ。

rm -rf "/target/directory path/*" "/target/directory path/.??*"

この秒は、を除いて。で始まるすべてに一致します。および.. .aのような名前では失敗しますが、それはあまり一般的ではありません。必要に応じて、すべてのケースをカバーするように調整できます。


両方試してみましたが、うまくいきませんでした。おそらく、ターゲットディレクトリのパスにスペースが含まれているためでしょうか。rm -rf '/ target / directory path / *'エラーは発生しませんが、サブディレクトリは残ります。
マイケルプレスコット

あなたが( ")のスペースの前にバックスラッシュ(\)で、または引用符で全体のディレクトリ名を囲むことにより、いずれか、スペースをエスケープする必要があり、私はこれを表示する例を編集した。。
KeithB

おかげで、以前のコメントに示されているようにそれを試してみましたが、まだ行きません。(私はOS Xを使用しています、それは重要ですか?)
Michael Prescott

OS Xは問題なく動作するはずです。それが私が使用しているものです。バックスラッシュと引用符の両方を使用しないようにしてください。どちらか一方のみ。
KeithB

はい、引用符を使用します。*を削除してrm -rf "/ target / directory path /"のみを使用している場合、「ディレクトリパス」ディレクトリは「ディレクトリパス」サブディレクトリとともに削除されます。rm -rf "/ target / directory path / *"を使用すると、何も起こりません。
マイケルプレスコット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.