shell - 更快找到"找到"

时间:2015-11-10 12:40:16

标签: linux shell find

我正在编写一个shell脚本,它应该输出目录中最旧的文件。 此目录位于远程服务器上,并且(最坏情况下)其中包含1000到1500(临时)文件。我无法访问服务器,我对文件的存储方式没有影响。服务器通过稳定但不是非常快的线连接。

我的脚本的结果被传递给监控系统,如果目录中有太多(=未处理的)文件,则监控系统会对工作人员提出异议。

不幸的是,监控系统只允许在发生超时之前为我的脚本执行最长30秒的执行时间。

在使用小目录进行测试时,这不是一个问题,这不是一个问题。使用远程安装目录(大约1000个文件)上的目标目录进行测试。

所以我正在寻找最快的方式来获得最新/最新/最大/最小的"文件在目录中(不是递归的)而不使用' find'或者排序' ls'

的输出

目前我在我的sh脚本中使用此语句:

old)
  # return oldest file (age in seconds)
  oldest=`find $2 -maxdepth 1 -type f | xargs ls -tr | head -1`
  timestamp=`stat -f %B $oldest`
  curdate=`date +%s`
  echo `expr $(($curdate-$timestamp))`
  ;;

我试过这个:

gfind /livedrive/669/iwt.save  -type f -printf "%T@ %P\n" | sort -nr | tail -1 | cut -d' ' -f 2-

这是使用谷歌可以找到的许多语句变体中的两种。

其他信息: 我在安装了sh和bash的FreeBSD Box上写这个。我可以完全访问该框,并可以根据需要安装程序。供参考:gfind是GNU - " find"从Linux中可以看出,FreeBSD有另一个"发现"默认安装。

感谢任何帮助

亲切的问候, 硬脑膜-采尔

3 个答案:

答案 0 :(得分:5)

对于最旧/最新的文件问题,您可以使用-t选项对使用修改时间对输出进行排序的ls。

  

-t按修改的降序时间排序(最近修改的第一个)。                如果两个文件具有相同的修改时间戳,请对它们进行排序                以字典顺序排列的名字。 -r选项反转                这两种排序顺序。

对于尺寸问题,您可以使用-S按大小对文件进行排序。

  

-S在排序操作数之前按大小排序(最大文件优先)                字典顺序。

请注意,对于这两种情况,-r将颠倒输出的顺序。

  

-r颠倒排序顺序。

这些选项可在FreeBSD和Linux上使用;并且在ls的大多数实现中必须非常常见。

让我们知道它是否足够快。

答案 1 :(得分:1)

一般来说,你是shouldn't be parsing the output of ls。在这种情况下,无论如何它只是作为stat的包装器,所以你也可以在每个文件上调用stat,并使用sort来获取最旧的文件。

old) now=$(date +%s)
     read name timestamp < <(stat -f "%N %B" "$2"/* | sort -k2,2n)
     echo $(( $now - $timestamp ))

以上是简明扼要的,但并没有区分常规文件和glob中的目录。如果有必要,请坚持使用find,但使用其他形式的-exec来尽量减少对stat的通话次数:

old ) now=$(date +%s)
      read name timestamp < <(find "$2" -maxdepth 1 -type f -exec stat -f "%N %B" '{}' + | sort -k2,2n)
     echo $(( $now - $timestamp ))

(如果文件名包含换行符,这两种方法都不起作用,但是因为您还没有在示例中使用文件名,所以可以通过从格式中删除%N并仅排序时间戳来避免此问题数字。例如:

read timestamp < <(stat -f %B "$2"/* | sort -n)
# or
read timestamp < <(find "$2" -maxdepth 1 -type f -exec stat -f %B '{}' + | sort -n)

答案 2 :(得分:0)

您是否可以尝试创建驻留在远程主机中的shell脚本,并在执行时提供所需的输出。然后从本地计算机上使用ssh或类似的东西来运行它。通过这种方式,脚本将在那里本地运行。只是一个想法: - )