Bash:如何使用 bash 脚本解析包含 ls -ltr 输出的日志文件以提取在特定时间之前修改的文件名

Bash: How to parse a log file that contains the output of ls -ltr using bash script to extract the file names that are modified before specific time

我正在尝试使用 Unix bash 脚本获取 SFTP 目录中最后修改时间在 24 小时之前的所有文件。请注意,我的环境不支持 lftp 选项。所以,我创建了一个脚本,将 SFTP 目录的所有子目录列出到本地文件,然后我使用循环遍历所有这些子目录名称,使用 ls -ltr 打印目录的内容并指示输出到本地文件。

现在我有一个包含以下内容的文件,假设当前时间是 10 月 28 日 22:32。

-rw------- 1 200      100             1930 Oct 25 08:31 File1
-rw------- 1 200      100              280 Oct 25 11:32 File2
-rw------- 1 200      100              280 Oct 25 12:17 File3
-rw------- 1 200      100              280 Oct 25 22:31 File4
-rw------- 1 200      100              280 Oct 26 22:32 File5
-rw------- 1 200      100              280 Oct 27 22:31 File6
-rw------- 1 200      100              280 Oct 16 09:59 File7
-rw------- 1 200      100              280 Oct 16 09:59 File8
-rw------- 1 200      100              280 Oct 16 10:00 File9

是否可以获取所有文件名及其最后修改时间戳,最后修改日期 < sysdate - 24 小时?

对于自动化,我强烈建议使用 'lftp'。 'sftp' 是一个简单的界面,适合交互式使用(例如,没有失败状态代码等)。

'lftp' 除了 'sftp' 之外还有很多选项。特别是,它有 'client side' 列表 (cls):

sftp
open sftp://host/path
user user password
cls -l --time-style='%Y-%m-%d %H:%M:%S'
Output:
drwxr-xr-x    2 root     root         4096 2019-10-13 16:01:46 /bin/
drwxr-xr-x    3 root     root         4096 2019-06-30 08:07:02 /boot/
drwxr-xr-x    2 root     root         4096 2019-06-09 19:36:33 /cdrom/
drwxr-xr-x   18 root     root         3960 2019-10-19 08:08:01 /dev/
drwxr-xr-x  150 root     root        12288 2019-10-20 15:49:39 /etc/
drwxr-xr-x    4 root     root         4096 2019-06-09 23:18:04 /home/

如果你正在寻找截止日期,你也可以按时间排序(我相信--sort=date,并且可以选择反向-r),一旦你符合日期范围就停止处理。

旁注:sftp 有一个有限的 'find' 命令。不幸的是,它不提供按日期过滤。

我尝试过的大多数其他 'sftp' 客户端都使用默认的 LS 格式。 Perl 的 SFTP 模块除外,Python,它以 "Unix" 格式向客户端提供日期,允许任何测试。但是,这比使用 lftp.

的工作要多得多

我最终逐行解析日志文件,将最后修改时间提取到一个变量,将文件名提取到另一个变量。然后我将最后修改的时间字符串转换为 Unix 时间格式,然后再转换为纪元号。同样,我得到了 sysdate-1 的纪元号。最后我比较了这两个值并过滤了符合我的标准的文件名。代码片段如下

prev_day_time=$(date +%s -d "$(date --date='1 day ago')")
file_mod_time=$(date +%s -d "$(date -d "$(echo $(echo $files_list | awk '{print }') | sed -e 's/\(.....\)/ /')")")