2010-12-20 53 views
1

我正在尝试为Linux和solaris编写一个shell脚本,该脚本会查找一些比X天早的特定文件,然后删除它们。诀窍是在这个过程中有几个文件不能被删除。查找比X天更早的文件,排除其他一些文件

例如从文件下面的列表我需要删除* .zip或保持* .log和* .something。*
1.zip
2.zip
3.log
prefix.something .suffix

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

+0

@Grove,我想创建一个脚本,我会养活找到的结果,然后在脚本中,我将包含文件的列表被排除。很简单,就像'如果不在列表中;那么rm -rf $ {file} else ... fi' – Anders 2010-12-20 11:02:24

+0

问题是要排除的文件每天都不相同。更具体的他们也是由某些系统生成的日志文件 – Morfic 2010-12-20 11:33:38

+0

@格罗夫,我仍然没有看到问题是什么,你想排除以.log和.something结尾的文件(无论这可能是什么),使用find并找到这些文件。将它们保存到一个数组,然后做一个查找所有文件,比较数组中的文件与文件查找找到(当搜索所有文件) – Anders 2010-12-20 13:07:54

回答

4

我身边的实验发现,一个可以从逻辑运算符这样的分组多个复杂的表达式中受益:

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

欢呼声,

+0

由于这解决了问题,因此您应该将其标记为已接受(可以接受您自己的答案)。 – caf 2010-12-21 00:56:18

+0

是的,我知道,但我必须等2天才能做到这一点;-) – Morfic 2010-12-21 08:40:45

2

我需要找到一种方法来提供一个硬编码列表排除文件不能删除,但要删除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; 
1

,或者你可以这样做:

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