【问题标题】:Bash Script: Find and Remove Folders Older Than 7 Days, With File That Does NOT Contain a Certain StringBash 脚本:查找和删除超过 7 天的文件夹,文件不包含特定字符串
【发布时间】:2013-03-04 15:36:16
【问题描述】:

我需要想出一个 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 的经验很少。

【问题讨论】:

  • 一个命令作用于目录,另一个作用于文件。您的意思是要删除超过 7 天且不包含任何包含字符串 &lt;claws&gt;18&lt;/claws&gt; 的文件的目录?
  • 是的!这正是我的意思。

标签: string bash find


【解决方案1】:
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}"

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

【讨论】:

  • 这不起作用。当我执行这个命令时,我得到的只是一个“>”,好像 bash 正在等待其他一些输入。发生了什么事?
【解决方案2】:

尝试使用 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

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 2017-07-03
    • 1970-01-01
    • 2020-07-27
    • 2017-07-09
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多