Unix查找脚本功能改进

时间:2013-05-04 02:23:15

标签: linux macos shell unix find

下面是一个简单的脚本,用于搜索超过30天的文件,然后返回文件数或ZERO。

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

  • 如果发现超过30天的任何内容,则退出循环,并移至list.dat中的下一行

这样,它就不必再通过某人的目录进一步递归,因为我们已经找到了我们正在寻找的东西,因为其中一些目录非常庞大而且我们正在使用老化的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

2 个答案:

答案 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的计数