【问题标题】:Find files older than X days excluding some other files查找超过 X 天的文件,不包括其他一些文件
【发布时间】:2010-12-20 10:51:26
【问题描述】:

我正在尝试为 linux 和 solaris 编写一个 shell 脚本,它会找到一些早于 X 天的特定文件,然后将其删除。诀窍是在此过程中,有几个文件不能删除。

例如,我需要从以下文件列表中删除 *.zip 并保留 *.log 和 *.something.*
1.zip
2.zip
3.日志
prefix.something.suffix

找到文件并将它们提供给 rm 很容易,但我在从删除列表中排除文件时遇到了困难。

【问题讨论】:

  • @Grove,我将创建一个脚本,我将提供 find 的结果,然后在该脚本中我将包含要排除的文件列表。很简单,比如if not in list; then rm -rf ${file} else ... fi
  • 问题是每天要排除的文件不一样。更具体地说,它们也是某些系统生成的日志文件
  • @Grove,我仍然不明白问题出在哪里,您想排除以 .log 和 .something 结尾的文件(无论这可能是什么),使用 find 并找到这些文件。将它们保存到一个数组中,然后对所有文件进行查找,将数组中的文件与查找文件进行比较定位(搜索所有文件时)
  • 你说得对,我没抓住你的意思:) 但似乎我可以从 find 本身做一些更优雅的事情:find -L path -type f \( -name ' .log' \) -a ! \( -name '.zip' -o -name 'something' \) -mtime +3.不过还是谢谢
  • @Grove,只要确保 Solaris 上的 find 版本支持这种操作即可。

标签: linux find solaris


【解决方案1】:

通过实验,我发现一个人可以从多个复杂的表达式中受益,这些表达式用逻辑运算符分组,如下所示:

find -L path -type f \( -name '*.log' \) -a ! \( -name '*.zip' -o -name '*something*' \) -mtime +3

干杯,
G

【讨论】:

  • 既然这样解决了问题,你应该把它标记为接受(接受你自己的答案是可以的)。
  • 是的,我知道,但我必须等待 2 天才能做到这一点;-)
【解决方案2】:

或者你可以这样做:

find /appl/ftp -type f -mtime +30 |grep -vf [exclude_file] | xargs rm -rf;

【讨论】:

  • 找到 /appl/ftp -type f -mtime +30 |grep -v [exclude_file] | xargs rm -rf;不需要用grep添加“f”
【解决方案3】:

我需要找到一种方法来提供排除文件的硬编码列表,以便不删除,但删除超过 30 天的所有其他文件。这是一个小脚本,用于删除所有超过 30 天的文件,[exclude_file] 中列出的文件除外。

EXCL_FILES=`/bin/cat [exclude_file]`;
RM_FILE=`/usr/bin/find [path] -type f -mtime +30`;

for I in $RM_FILES;
do
     for J in $EXCL_FILES; 
     do
          grep $J $I;
          if [[ $? == 0 ]]; then
               /bin/rm $I;
               if [[ $? != 0 ]]; then echo "PROBLEM: Could not remove $I"; exit 1; fi;
          fi;
     done;
done;

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2015-10-02
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多