2011-09-27 45 views
2

我正在编写一个bash脚本,需要执行的任务之一是通过curl连接到FTP服务器并查找最后一个的名称修改.zip文件。使用带卷曲的bash脚本通过FTP检索目录中的最后一个修改文件

我们正在查看的文件的名称格式是MM_DD_YYYY_ALL.zip

到目前为止,我有,与遗漏<< >>

export FILEPATTERN=_ALL.zip 

for FILE in `curl -u << SERVER INFO >> 2> /dev/null | grep ${FILEPATTERN} | awk -F\ '{print $9}'` 
do 
    ... 
    # Do stuff with each file to determine most recent version. 
    ... 
done 

该文件的名称没有被格式化YYYY_MM_DD的事实似乎是主要的原因,这不能用一些快速修整和计算来完成。

有没有一种有效的方法从这个列表中拉取最近修改的zip文件的名称?还是有一些处理可以在列表生成时完成?

干杯。

回答

4

您可以使用多键sort命令对文件名进行一次排序,并使用tail获取最后一行以获取最新文件。

您需要指定-t-以使用短划线作为排序的字段分隔符-n以获取数字排序并按优先级顺序列出每个字段。一个字段说明符的格式为:

-k, --key=POS1[,POS2]  start a key at POS1 (origin 1), end it at POS2 
          (default end of line) 

所以对于年,战地3,您需要与它的4个字符的宽度-k3,4列出。

如果按照该顺序按年份,月份和日期字段进行排序,则最终将包含一个按日期顺序包含所有文件的列表。

因此,而不是上面的for循环,你可以使用:

FILE=`curl -u << SERVER INFO >> 2> /dev/null | grep ${FILEPATTERN} | awk -F\ '{print $9}' 
    | sort -n -t- -k3,4 -k1,2 -k2,2 |tail -1` 
+0

干杯,会给它一个去。会回到你身边。 –

+0

完美工作。谢谢彼得。 –

0

编辑:对不起,我只是意识到你需要的文件是在远程FTP服务器上。我原以为他们是本地人,而且你希望上传到FTP。所以下面的一切都是无关紧要的。

通常我会这样做: ls -1rt /path/to/zips/*.zip | tail -n1

这并不总是一个好主意,文件名中的空格等,但它会返回目录中最近的文件名。

还有发现。您可以指定日期范围和名称。根据您正在做的事情,您可能会选择每x分钟扫描一次目录,查找最近x分钟内创建的文件。这有一个好处,它会拿起多个新文件。