在Bash Script中删除包含特定文件的目录

时间:2015-05-14 03:56:39

标签: bash find xargs rm

我想删除特定文件(如果存在)以及包含这些文件的目录。我知道我想要擦除的文件但不知道目录。到目前为止,作为我在bash脚本编写方面的新成员,我想到了这一点:

find ./ -type f -name '*.r*' -print0 | xargs -0 rm -rf &> log_del.txt
find ./ -type f -name '*.c*' -print0 | xargs -0 rm -rf &>> log_del.txt

目前,所有以特定扩展名*.r**.c*命名的文件都将被删除。 但是目录仍然存在,并且如果存在,也是其中的子目录。 我还想到-o中的find选项要删除一行:

find ./ -type f \( -name '*.r*' -o -name '*.c*' \) -print0 | xargs -0 rm -rf &> log_del.txt

我该怎么做? 而且我也看到我的log_del.txt文件是空的......: - (

3 个答案:

答案 0 :(得分:0)

如果目录仍为空,请rmdir尝试删除所有目录。它将在任何仍有文件的目录上失败。

find ./ -type d -exec rmdir --ignore-fail-on-non-empty {} 2>/dev/null \;

答案 1 :(得分:0)

看看这是否符合您的要求:

find ./ -type f -name '*.r*' -delete -printf "%h\0" | xargs -0 rmdir

如果目录包含任何其他文件,则rmdir将失败。

请考虑以下示例文件结构:

$ find a
a/
a/a/
a/a/4
a/b/
a/b/5
a/b/4
a/b/3
a/b/2
a/b/1

$ find a -type f -name '4' -delete -printf "%h\0" | xargs -0 -r rmdir
rmdir: failed to remove ‘a/b’: Directory not empty

$ find a
a
a/b
a/b/5
a/b/3
a/b/2
a/b/1

如果在上面的示例中,您还要删除目录b,则只需使用:

$ find ./ -type f -name '*.r*' -printf "%h\0" | xargs -0 rm -rf

编辑:根据评论,您(OP)希望也应删除空目录树。这两个命令应该可以帮助你:

$ find ./ -type f -name '*.r*' -delete # Delete matching files
$ find ./ -empty -type d -delete # Delete tree of empty directories

答案 2 :(得分:0)

看起来你真正想要的是递归删除所有空目录。

find . -type d -delete

-delete以子优先顺序处理目录,以便在a之前删除a / b。如果给定目录不为空,find将只显示错误并继续。