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/\(.....\)/ /')")")
我正在尝试使用 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/\(.....\)/ /')")")