下面是一个简单的脚本,用于搜索超过30天的文件,然后返回文件数或ZERO。
如果可能的话,我希望它能做到以下几点:
这样,它就不必再通过某人的目录进一步递归,因为我们已经找到了我们正在寻找的东西,因为其中一些目录非常庞大而且我们正在使用老化的SAN,因此它很冰爽。
我们基本上是在尝试生成一个闲置超过30天的“主页”文件夹的报告,但无法通过除此之外的任何其他方式提取此信息。
我不相信有任何方法可以捕捉'find'的退出状态,使这更容易......
或者,如果有人对如何做到这一点有不同的建议,我会全力以赴。
任何建议,想法或帮助非常感谢!
丹
#!/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
答案 0 :(得分: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
中的其中一个被发现之后持续一段时间; man 1 find
明确声明-quit
结束所有子进程,但这可能不会立即发生。这只是我的猜测;我没有在大树上测试它,也没看过源。我从未在find
之后看到-quit
继续递归下降。我从未在OSX或BSD + GNU findutils上尝试过它。 YMMV。
答案 1 :(得分:1)
如果你管道到头-1然后wc -l这应该在你找到第一个文件后终止命令
COUNT=$(find $SOURCEDIR/$line -type f -mtime -30 | head -1 | wc -l)
如果文件的修改时间少于30天,则会返回1的计数