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

Delete directories with specific files in Bash Script

我想删除特定文件(如果存在)以及包含这些文件的目录。我确实知道我想擦除的文件,但不知道目录。到目前为止,由于我是 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* 命名的文件都将被删除。 但是目录仍然存在,其中的子目录(如果存在)仍然存在。 我还想到了 find 中的选项 -o 在一行中删除:

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

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

如果目录仍然是空的,让rmdir尝试删除所有目录。它会在任何有静止文件的目录上失败。

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

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

find ./ -type f -name '*.r*' -delete -printf "%h[=10=]" | 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[=11=]" | 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[=12=]" | xargs -0 rm -rf

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

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

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

find . -type d -delete

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