我是 shell 脚本的新手,所以我需要一些帮助来解决这个问题。
我有一个目录,其中包含以下格式的文件。这些文件位于名为/incoming/external/data 的目录中
AA_20100806.dat
AA_20100807.dat
AA_20100808.dat
AA_20100809.dat
AA_20100810.dat
AA_20100811.dat
AA_20100812.dat
如您所见,文件的文件名包含时间戳。即 [RANGE]_[YYYYMMDD].dat
我需要做的是使用文件名上的时间戳而不是系统时间戳找出这些文件中哪些文件具有最新日期,并将文件名存储在变量中并将其移动到另一个目录并将其余文件移动到另一个目录.
最佳答案
对于那些只想得到答案的人,这里是:
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
这会获取输入并根据第二个字段对其进行排序。排序命令默认使用空格作为分隔符。在写这个更新的时候,我找到了排序的文档,它允许你指定分隔符,所以 AWK 和 SED 是不必要的。获取 ls 并通过以下排序对其进行管道处理:
sort -n -t _ -k 2
这实现了相同的结果。现在你只需要最后一个文件,所以:
tail -1
如果您使用 awk 来分隔文件(这只会增加额外的复杂性,所以不要这样做 sheepish),您可以再次使用 sed 将空格替换为下划线:
sed 's/ /_/'
这里有一些很好的信息,但我相信大多数人不会像这样深入阅读。
关于bash - 根据时间戳获取最新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3495609/