我正在编写一个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有另一个"发现"默认安装。
感谢任何帮助
亲切的问候, 硬脑膜-采尔
答案 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或类似的东西来运行它。通过这种方式,脚本将在那里本地运行。只是一个想法: - )