我有来自远程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中这样做?
答案 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
被服务器的主机和端口替换。
上述也可以在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
进行测试,看看哪个符合您的需求。