对于那些只想要答案的人,这里是:
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 -n -t _ -k 2
这实现了相同的结果。现在你只想要最后一个文件,所以:
tail -1
如果您使用 awk 分隔文件(这只是增加了额外的复杂性,所以不要这样做 sheepish),您可以使用 sed 再次将空格替换为下划线:
sed 's/ /_/'
这里有一些很好的信息,但我相信大多数人不会像这样深入阅读。