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