0

我需要提出一个 Bash 脚本,如果它们满足以下两个条件,它将删除目录中的任何文件夹:

  1. 超过 7 天。
  2. 其中有一个不包含特定字符串的 xml 文件。

我知道此命令适用于删除目录中超过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 的经验很少。

4

2 回答 2

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}"

此外,如果有子目录,它可能会导致问题。

于 2013-03-15T20:28:50.243 回答
0

尝试使用 grepv--invert-match标签:

find ./* -name "kittens.xml" -type f\! -exec grep -L -v "<claws>18</claws>" {} \;| xargs rm -fv

您可以通过在终端中使用它来找到有关grep invert的更多信息:

grep --help | grep invert
于 2016-07-26T08:58:14.207 回答