Bash脚本:查找和删除7天以上的文件夹,文件不包含某些字符串

时间:2013-03-15 19:26:03

标签: string bash find

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

  1. 超过7天。
  2. 在其中包含一个不包含特定字符串的xml文件。
  3. 我知道此命令适用于删除目录中早于 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的经验很少。

2 个答案:

答案 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