我需要提出一个Bash脚本,如果它们满足以下两个条件,它将删除目录中的所有文件夹:
我知道此命令适用于删除目录中早于 n 天的所有文件夹:
find ./ -type d -mtime +7 -exec rm -rf {}\;
此命令会删除名为kittens.xml的所有文件,这些文件不具有字符串<claws>18</claws>
:
find ./* -name "kittens.xml" -type f\! -exec grep -L "<claws>18</claws>" {} \;| xargs rm -fv
但是如何删除超过一周的所有文件夹并且不包含该字符串?
仅供参考,我之前对Bash的经验很少。
答案 0 :(得分:0)
for dir in `find /WHERE/ARE/THOSE/DIRS -type d -mtime +7 2>/dev/null` ; do
fgrep '<claws>18</claws>' "${dir}/kittens.xml" &>/dev/null || rm -fv "${dir}"
done
它遍历找到的目录,然后通过fgrep检查文件中所需的字符串,如果找不到(例如,不在文件中或文件丢失),则删除目录。
注意:它可能会造成伤害,所以在运行前请先考虑一下。我会先这样运行它,这样就可以显示它会删除...
fgrep '<claws>18</claws>' "${dir}/kittens.xml" &>/dev/null || echo "rm -fv ${dir}"
此外,如果存在子目录,则可能会导致问题。
答案 1 :(得分:0)
尝试使用grep v
或--invert-match
标记:
find ./* -name "kittens.xml" -type f\! -exec grep -L -v "<claws>18</claws>" {} \;| xargs rm -fv
您可以在终端中找到有关 grep invert 的更多信息:
grep --help | grep invert