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

问题描述

我正在尝试使用 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 小时?

标签: bashshellunixsftp

解决方案


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

'lftp' 有很多超越 'sftp' 的选项。特别是,它具有“客户端”列表(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 有一个有限的“查找”命令。不幸的是,它不提供按日期过滤。

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


推荐阅读