我有一个目录,其中包含以下格式的文件.这些文件位于一个名为/ 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]文件,我们需要存储该文件名.
可用的工具(我只列出了这个问题的相关工具……通过练习识别它们变得更容易):
> ls
> sed
> awk (or nawk)
> sort
> tail
我想我们不需要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美元).请注意,空间是我最初建议中缺少的部分.此外,这是不必要的,因为您可以在下面的sort命令中指定分隔符.
现在输出被分成每行的[RANGE] [yyyymmdd] .dat.现在我们可以对此进行排序
sort -n -k 2
这将获取输入并根据第二个字段对其进行排序. sort命令默认使用空格作为分隔符.在编写此更新时,我找到了sort文档,它允许您指定分隔符,因此不需要AWK和SED.拿下ls并通过以下方式管道:
sort -n -t _ -k 2
这实现了相同的结果.现在你只想要最后一个文件,所以:
tail -1
如果你使用awk来分隔文件(这只是增加额外的复杂性,所以不要羞怯),你可以用sed用下划线替换空格:
sed 's/ /_/'
这里有一些很好的信息,但我相信大多数人都不会像这样读到底部.