对于那些只想要一个答案的人,这里它是:
ls | sort -n -t _ -k 2 | tail -1
这是我思考的过程。
我会假设 [RANGE] 部分可以是任何内容。
从我们知道的开始。
- 工作目录:/incoming/external/data
- 文件格式:[RANGE]_[YYYYMMDD].dat
我们需要在目录中找到最近的 [YYYYMMDD] 文件,并将文件名存储下来。
可用的工具(我只列出了与此问题相关的工具...通过实践识别它们变得更容易):
我想我们不需要 sed,因为我们可以使用 ls 命令的整个输出。使用 ls、awk、sort 和 tail,我们可以像这样获取正确的文件(请记住,您需要根据您的操作系统检查语法):
NEWESTFILE=`ls | awk -F_ '{print $1 $2}' | sort -n -k 2,2 | tail -1`
然后只需要将下划线放回去,这应该不太难。
编辑:我有点时间,所以至少在Solaris中修复了该命令的使用。
以下是复杂的第一步(假设目录中的所有文件都具有相同的格式:[RANGE]_[yyyymmdd].dat)。我敢打赌有更好的方法来完成这个任务,但这可以处理我的测试数据(事实上,我刚刚发现了更好的方法;请参见下文):
ls | awk -F_ '{print $1 " " $2}' | sort -n -k 2 | tail -1 | sed 's/ /_/'
在写这个的时候,我发现你可以这样做:
ls | sort -n -t _ -k 2 | tail -1
我会将其分解为几个部分。
ls
很简单...获取目录列表,只有文件名。现在我可以将其导入到下一个命令中。
awk -F_ '{print $1 " " $2}'
这是AWK命令。它允许您以特定方式修改输入行。在这里,我所做的只是指定awk应在下划线(_)处断开输入。我使用-F选项来实现这一点。这给了我每个文件名的两个部分。然后我告诉awk输出第一部分($1),后跟一个空格(“ ”),然后是第二部分($2)。请注意,空格是我最初建议中缺少的部分。此外,这是不必要的,因为您可以在下面的排序命令中指定分隔符。
现在输出被拆分成每行的[RANGE] [yyyymmdd].dat。现在我们可以对其进行排序:
sort -n -k 2
这个命令会根据第二个字段对输入内容进行排序,sort命令默认使用空格作为分隔符。在编写此更新时,我找到了sort的文档,允许您指定分隔符,因此AWK和SED是不必要的。将ls命令的输出通过以下sort命令进行管道传输:
sort -n -t _ -k 2
这样做可以达到相同的结果。现在你只需要最后一个文件,所以:
tail -1
如果你使用 awk 命令来分离文件的话(这只会增加额外的复杂度,所以不要那么做),你可以使用 sed 命令再次将空格替换为下划线:
sed 's/ /_/'
这里有一些好的信息,但我相信大多数人不会像这样读到底部。