rm可以递归删除空目录吗?


9

在旧版本的Unix中,rm如果目录为空,该命令将删除目录。从rm的Research Unix第八版手册页:“如果条目是目录,则只有在为空时才将其删除。” 我喜欢这种行为,所以在我的名字中有了这个别名/etc/profilealias 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年

Answers:


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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.