web-dev-qa-db-ja.com

空のディレクトリツリーを削除する(できるだけ多くのディレクトリを削除するが、ファイルは削除しない)

次のようなdirツリーがあるとします。

ROOTDIR
    └--SUBDIR1
        └----SUBDIR2
            └----SUBDIR3

入力したときに次のようなコマンドを探しています。

$ [unknown command] ROOTDIR

Dirツリー全体を削除できますファイルがなく、ツリー全体にdirsしかない場合。ただし、SUBDIR1の下にhello.pdfというファイルがある場合は、

ROOTDIR
    └--SUBDIR1
        └--hello.pdf
        └----SUBDIR2
            └----SUBDIR3

次に、コマンドはSUBDIR2以下のみを削除する必要があります。

14
gsklee

アレクシスは近いです。あなたがする必要があるのはこれです:

find . -type d -depth -empty -exec rmdir "{}" \;

最初に空のディレクトリが見つかるまでディレクトリツリーをドリルダウンし、それを削除します。したがって、親ディレクトリを空にしてから削除します。これにより、望ましい効果が得られます(これはおそらく週に10回行うので、間違いなく正しいと思います)。 :-)

11
Steve Juranich
find ROOTDIR -type d -empty -delete

と同じ

find ROOTDIR -type d -depth -empty -exec rmdir "{}" \;

ただし、組み込みの「-delete」アクションを使用します。

「-delete」は「-depth」を意味することに注意してください。

25
go2null

私はこれを試します:

find ROOTDIR -type d -depth -exec rmdir {} \;
3
Alexis

安全に行う前に、いくつかの要件があります。

  1. 最初にサブディレクトリを削除してから、上位レベルのディレクトリを削除します。つまり、ディレクトリリストを並べ替えるか、rmdir --parentsフラグを使用する必要があります。
  2. start [〜#〜] rootdir [〜#〜]常に/または./を付けて、-で始まるファイルの予期しない事態を回避します
  3. nULで終了するディレクトリのリストを使用して、スペースを含むディレクトリ名を操作する

これがシェルでそれを行う方法です:

find ./ROOTDIR -type d | sort -r | tr '\n' '\000' | xargs -0 rmdir --ignore-fail-on-non-empty

いくつかの冗長なエラーが気にならない場合は、親を持つすべてのディレクトリを強制的に削除することができ、並べ替えを行う必要はありません(NULで終了する文字列を並べ替えることができないため、trに追加する必要があります)。

find ./ROOTDIR -type d -print0 | xargs -0 rmdir --ignore-fail-on-non-empty --parents
1
Cougar
rmdir $(find ROOTDIR -type d | sort -r)
0
lanzz

私はこれを行います:

find ROOTDIR -type d | xargs -0 -I {} rmdir {}
0
chemila