【问题标题】:Unix find script feature improvementUnix 查找脚本功能改进
【发布时间】:2013-04-28 12:13:34
【问题描述】:

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

如果可能,我希望它执行以下操作:

  • 如果发现任何超过 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

【问题讨论】:

    标签: linux macos shell unix find


    【解决方案1】:

    尝试在find的命令行中添加-quit选项;一旦找到第一个匹配的文件,它就会退出。您必须添加 -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。

    【讨论】:

    • 感谢您的建议,但我认为 find 没有 -quit 选项——至少它不在手册页中并且它不起作用。除非我有这个错误: if [ -n "$(find ${SOURCEDIR}/${line} -type f -mtime -30 -quit)" ] ;那么
    • 我已经更新了我的答案,以确保它更防弹。它确实包含一个被忽视的细节:使用-quit,你需要-print
    • @Doug BSD find 似乎没有 -quit ,但这确实是您想要的。如果可以的话,你可以通过 homebrew 在 OSX 上安装 GNU 版本。
    • @9000 谢谢,做到了。我需要通过 MacPorts 轻松安装的 GNU findutils。再加上你的绳子,我得到了我想要的东西。太感谢了! PS,为什么 -quit 没有内置在 BDS 查找(或 CentOS)中,这超出了我的理解!干杯。
    • @9000 实际上我说得太早了。即使找到符合条件的文件,它仍然会递归。
    【解决方案2】:

    如果你先管道到 head -1 然后 wc -l 这应该会在你找到第一个文件后终止命令

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

    如果文件在 30 天前被修改,这将返回计数 1

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2016-03-18
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多