在 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
将只显示错误并继续。
我想删除特定文件(如果存在)以及包含这些文件的目录。我确实知道我想擦除的文件,但不知道目录。到目前为止,由于我是 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
将只显示错误并继续。