在具有模式的目录中查找文件名

时间:2017-08-03 02:13:53

标签: shell unix

我需要在目录DIR中找到最新文件 - filename_YYYYMMDD

以下不起作用,因为位置每次都在移动,因为它们之间的空格(主要发生在文件大小字段,因为它每次都不同。)

如果有其他方式,请建议。

report =‘ls -ltr $DIR/filename_* 2>/dev/null | tail -1 | cut -d “ “ -f9’

2 个答案:

答案 0 :(得分:0)

您可以使用AWK剪切最后一个字段。如下所示

report=`ls -ltr $DIR/filename_* 2>/dev/null | tail -1 | awk '{print $NF}'`

切割可能不是一个选项

答案 1 :(得分:0)

如果我了解你想循环遍历目录中的每个文件并提交最大'YYYYMMDD'值和与该值相关联的文件名,则可以使用简单POSIX parameter expansion with substring removal来隔离{{1}并且,当您遍历目录中的所有文件时,与初始化为'YYYYMMDD'的值进行比较,以更新zero变量以保留最大latest。每次找到较大的'YYYYMMDD'时,您都可以存储文件的name

例如,您可以执行以下操作:

'YYYYMMDD'

示例目录

#!/bin/sh
name= 
latest=0
for i in *; do 
    test "${i##*_}" -gt "$latest" && { latest="${i##*_}"; name="$i"; }
done
printf "%s\n" "$name"

示例使用/输出

$ ls -1rt
filename_20120615
filename_20120612
filename_20120115
filename_20120112
filename_20110615
filename_20110612
filename_20110115
filename_20110112
filename_20100615
filename_20100612
filename_20100115
filename_20100112

脚本选择$ name=; latest=0; \ > for i in *; do \ > test "${i##*_}" -gt "$latest" && { latest="${i##*_}"; name="$i"; }; \ > done; \ > printf "%s\n" "$name" filename_20120615 作为目录中所有文件中filename_20120615个最大的文件。

由于您只使用shell本身提供的工具,因此不需要为它调用的每个管道或实用程序生成子shell。

进行测试并告诉我这是否符合您的意图,如果您的意图不同,或者您有任何其他问题,请告诉我。

相关问题