如果列表中的文件超过7天,如何检查FTP

时间:2014-07-24 22:57:21

标签: bash

我有来自远程FTP服务器的文件列表:

drwxrwxrwx   2 test-backup everyone     4096 Jul  8 02:30 .
drwxrwxrwx   5 0        0            4096 Jul 23 07:02 ..
-rw-rw-rw-   1 test-backup everyone   352696 Jul 18 02:30 expdp_TEST11P2_custom_Fri.dmp.gz
-rw-rw-rw-   1 test-backup everyone   352796 Jul 21 02:30 expdp_TEST11P2_custom_Mon.dmp.gz
-rw-rw-rw-   1 test-backup everyone   352615 Jul 19 02:30 expdp_TEST11P2_custom_Sat.dmp.gz
-rw-rw-rw-   1 test-backup everyone   352626 Jul 20 02:30 expdp_TEST11P2_custom_Sun.dmp.gz
-rw-rw-rw-   1 test-backup everyone 10511523642 Jul 24 03:08 expdp_TEST11P2_custom_Thu.dmp.gz
-rw-rw-rw-   1 test-backup everyone 10496881744 Jul 22 03:03 expdp_TEST11P2_custom_Tue.dmp.gz
-rw-rw-rw-   1 test-backup everyone 10504557195 Jul 23 03:03 expdp_TEST11P2_custom_Wed.dmp.gz

我需要检查是否有超过7天的文件,你有什么想法我怎么能在Bash中这样做?

2 个答案:

答案 0 :(得分:1)

据我所知,您有一个通过ftp收到的文件列表列表(并且您无法访问远程服务器上的find)。假设您将目录列表存储在名为ftptimes的文件中,那么您可以通过以下方式识别超过7天的文件:

$ awk -v cutoff="$(date -d "7 days ago" +%s)" '{line=$0; "date -d \""$6" " $7" " $8 "\" +%s" |getline; fdate=$1} fdate < cutoff {print line} ' ftptimes

从您的样本日期开始,输出将为:

drwxrwxrwx   2 test-backup everyone     4096 Jul  8 02:30 .

逐个寻址awk命令的各个部分:

  • -v cutoff =&#34; $(日期-d&#34; 7天前&#34; +%s)&#34;

    这定义了一个名为awk的{​​{1}}变量,该变量具有与七天前相对应的Unix时间(1970-01-01 00:00:00 UTC后的秒数)

  • cutoff

    这节省了以后将当前输入行用于变量line=$0;

  • line

    这会将ftp给出的日期转换为Unix时间,读取该时间,并将其保存在名为"date -d \""$6" " $7" " $8 "\" +%s" |getline; fdate=$1的变量中。

  • fdate

    如果文件日期小于截止日期,则打印该行。

在您提供的示例数据中,唯一超过七天的文件是当前目录(fdate < cutoff {print line}),其日期为7月8日。

例如,如果我们想要文件超过5天,则会打印更多文件:

.

在上面,我假设来自ftp的信息存储在一个文件中。也可以将其输入:

$ awk -v cutoff="$(date -d "5 days ago" +%s)" '{line=$0; "date -d \""$6" " $7" " $8 "\" +%s" |getline; fdate=$1} fdate < cutoff {print line} ' ftptimes
drwxrwxrwx   2 test-backup everyone     4096 Jul  8 02:30 .
-rw-rw-rw-   1 test-backup everyone   352696 Jul 18 02:30 expdp_TEST11P2_custom_Fri.dmp.gz
-rw-rw-rw-   1 test-backup everyone   352615 Jul 19 02:30 expdp_TEST11P2_custom_Sat.dmp.gz

其中 echo ls | ftp host port | awk -v cutoff="$(date -d "5 days ago" +%s)" '{line=$0; "date -d \""$6" " $7" " $8 "\" +%s" |getline; fdate=$1} fdate < cutoff {print line} ' host被服务器的主机和端口替换。

Bash版

上述也可以在port中完成,尽管它需要显式循环。再次,假设文件bash中的ftp信息:

ftptimes

答案 1 :(得分:-1)

find命令对日期范围最灵活。您有3种基本测试可供选择:-atime +n(上次访问时间大于n * 24小时前); -ctime +n(文件状态变更大于n * 24小时前);和-mtime +n(文件修改大于n * 24小时前)。注意:使用n意味着n*24 hours ago; +n表示greater than n*24 hours ago-n表示less than n*24 hours ago。另请注意,24小时内的任何小数部分都会被忽略,这意味着您可能需要将+n调整为+6以获取所有文件greater than 6 days old(意味着7天之久)而不是{ {1}}。例如:

+7

将在find /path/to/files -type f -mtime +6 中找到大于6天前(即7天)修改的所有files(非dirs)。您可以使用/path/to/files-atime-ctime进行测试,看看哪个符合您的需求。