空のディレクトリを再帰的に削除できますか?


9

古いバージョンのUnixでは、rmコマンドはディレクトリが空の場合にディレクトリを削除しました。rmのResearch Unix Eighth Editionのマニュアルページから:「エントリがディレクトリの場合、空の場合のみ削除されます。」私はこの動作が好きなので、このエイリアスを自分の中に持ってい/etc/profileます。alias rm='rm -d'私はGNU coreutilsバージョンのを使用しています。このバージョンではrm、ディレクトリが空の場合は先に進み、ディレクトリを削除するように-d指示rmしています。

ここまでは順調ですね。このエイリアスによりrm、昔と同じように使用できます。しかし、私はそれをさらに一歩進めたいと思います。私は...したいrmディレクトリに他のディレクトリが含まれている場合でも、ディレクトリのみが存在する限り、ディレクトリを削除します。ディレクトリ構造がどのくらい深いかは関係ありません。そこにファイルがなく、空になったら(一番下に到達したら)、ディレクトリをrmすべて削除します。

これは、通常として機能し、rm渡されたファイルを削除するエイリアスとして記述できますか?


いかがrmdir -pですか?
Kevin

ケビンの提案に感謝しますが、これは私が探している行動ではありません。を実行しmkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;ても、a、a / b2、a / b2 / c2が残っています。私が望むのは、トップレベル(この場合はa)だけをに渡し、その下のrmすべてを削除することです。
WhiteHotLoveTiger 2013

回答:


8

ディレクトリツリーを走査して、ディレクトリ以外のものが含まれているかどうかを確認します。これはrmの機能を超えています。などの他のツールが必要findです。この方法で、指定されたディレクトリの下の空のディレクトリを削除できます(-depth空になった親ディレクトリも削除されます):

find "$x" -depth -type d -exec rmdir {} +

次の関数は、各引数について、それがディレクトリ以外のファイルまたはディレクトリ以外のものが含まれていないディレクトリツリーの場合、引数を削除します。この関数はアトミックではないことに注意してください。実行中に引数のいずれかが変更されると、エラーメッセージが表示されることがありますが、引数として渡されたディレクトリ内の非ディレクトリは削除されないので安全です。

rm () {
  ret=0
  for x; do
    case $x in -*) x=./$x;; esac
    if [ -d "$x" ]; then
      if [ -n "$(find "$x" ! -type d | head -n 1)" ]; then
        echo 1>&2 "$x: non-empty directory tree"
        ret=2
      else
        find "$x" -depth -exec rmdir {} +
        if [ -d "$x" ]; then ret=2; fi
      fi
    else
      command rm "$x" || [ $ret -gt 1 ] || ret=2
    fi
  done
  return $ret
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.