2013-05-04 62 views
1

下面是一个简单的脚本,用于搜索30天以前的文件,然后返回文件数或ZERO。Unix查找脚本功能改进

我想它做到以下几点,如果可能的话:

从环
  • 退出,如果发现任何超过30天,并移动到下一行list.dat

这样,由于我们找到了我们正在寻找的内容,因此它不需要通过某人的目录进一步递归,因为其中一些目录很大,而且我们使用的是老化的SAN,所以它是冰河的。

我们基本上试图生成一个已经闲置超过30天的“家”文件夹的报告,但无法通过除此之外的任何其他方式提取此信息。

我不相信有任何的方式来捕捉的“查找”退出状态,使这个变得更容易...

或者,如果任何人有如何做到这一点不同的建议,我所有的耳朵。

任何建议,想法或帮助非常感谢!

#!/bin/sh 
PATH=/bin:/usr/bin:/usr/sbin export PATH 
SOURCEDIR=/Volumes/UserHomes/ 

while IFS= read -r line 

do 

    COUNT=$(find $SOURCEDIR/$line -type f -mtime -30 | wc -l) 
    if [ "$COUNT" -eq 0 ]; then 
    echo $line ZERO 
    else 
    echo $line $COUNT files found 
    fi 

done < $SRCLIST 

回答

4

尝试增加-quit选项find的命令线;一旦找到第一个匹配文件,它就退出。您必须添加-print以确保发现的名称已打印。

有了这个,你可以简化你的表达:

if [ -n "$(find ${SOURCEDIR}/${line} ... -print -quit)" ] ; then 
    echo "Something found in ${line}!" 
fi 

这里有一个最小的证明概念的例子,给出了这个概念。

# get us an empty dir 
mkdir find-example 
cd find-example 

# create/freshen a few files 
touch foo bar baz 

# create a subdir with a matching file 
mkdir -p nested 
touch nested/quux 

# finds four files: 
find . -type f -mtime -30 
# prints: 
# ./foo 
# ./nested/quux 
# ./baz 
# ./bar 

# finds only one file and stops 
find . -type f -mtime -30 -print -quit 

# prints: 
# ./foo 
# and exits. 

上述内容可在GNU/Linux上重新调试,尤其是Ubuntu 12.04。

我可以想像,find可能叉加快并行扫描子目录,和其他搜索过程可能会持续-quit已经在其中一人被ecountered后的一段时间; man 1 find明确指出-quit结束了所有的子过程,但这可能不会立即发生。这只是我的猜测;我没有在大树上进行测试,也没有看到源代码。我从来没有看到find-quit后继续递归下降。我从来没有在OSX或BSD + GNU findutils上试过它。因人而异。

+0

感谢您的建议,但我不认为发现有一个--quit选项 - 至少它不是在手册页,它不工作。除非我有这个错误:if [-n“$(find $ {SOURCEDIR}/$ {line} -type f -mtime -30 -quit)”];然后 – Dan 2013-05-04 15:43:16

+0

我已经更新了我的答案,以确保它更加防弹。它确实包含了一个被忽略的细节:用'-quit',你需要'-print'。 – 9000 2013-05-04 19:15:19

+0

@Doug BSD查找似乎没有--quit,但这真的是你想要的。如果它是一个选项,你可以通过homebrew在OSX上安装GNU版本。 – 2013-05-04 19:29:29

1

如果管头-1,然后WC -l这应该一旦你找到的第一个文件

COUNT=$(find $SOURCEDIR/$line -type f -mtime -30 | head -1 | wc -l) 

这将返回计数1,如果一个文件被修改少于三十日终止命令前