列出存储在具有特定时间戳的文本文件中的文件名

列出存储在具有特定时间戳的文本文件中的文件名

我已将几个文件名存储在一个文本文件中,名称为新1.txt在我的主目录中,现在我使用循环列出它们所在目录中的所有文件。我可以编写命令来执行此操作 while read in; do ls -lrt /newusr/home/logs/"$in"; done < new1.txt

这些日志是昨天生成的,我想要的是找到昨天下午 2 点之后生成的所有文件,我尝试插入一条 grep 语句,但我认为我写错了
while read in; do ls -lrt /prdusr/rhd/prdoper/opLogDir/"$in"; done < new1.txt | grep "Dec 18 {14-23}"。语法或我可以实现此目的的任何其他方式有什么问题吗?

答案1

首先创建一个具有正确时间戳的参考时间戳文件mtime

touch -d 2019-12-18T14:00 timestamp

然后解析您的文件,并针对每个文件测试该文件是否比timestamp我们刚刚创建的文件新:

while IFS= read -r name; do
    if [[ /prdusr/rhd/prdoper/opLogDir/$name -nt timestamp ]]; then
        printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
    fi
done <new1.txt

这使用-nt文件测试来bash检查修改时间戳(请注意,bash不会以亚秒精度执行此测试)。

使用 POSIX 工具:

touch -d 2019-12-18T14:00 timestamp

while IFS= read -r name; do
    if [ -n "$( find "/prdusr/rhd/prdoper/opLogDir/$name" -newer timestamp )" ]
    then
        printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
    fi
done <new1.txt

这将使用相反的方法进行测试find,如果手头的文件在文件之后被修改timestamp,则输出找到的路径,并且 shell 会将输出检测为非空字符串并调用printf.

答案2

使用grep过滤时间戳来获取一系列可接受的时间并不容易,因为正则表达式是为文本模式设计的,而不是数字比较(参见例如以及其他类似的问题)。

在你的具体情况下,您可以将语句修改为

grep -E "Dec 18 (1[4-9]|2[0123])"

但请注意,这需要 GNUgrep和“扩展正则表达式”语法。您使用的语法会搜索文字字符串 {14-23}出现在你的ls输出行中。

另外,作为一般说明,解析 的输出ls强烈不推荐因为如果您的文件名包含不常见的字符或您的区域设置导致不同的时间戳格式等,则会出现很多陷阱。您选择的方法,例如完全依赖于显示过去 1/2 内发生的修改时间的ls时间戳的习惯Mon DD HH:MM年左右。使用起来更安全,例如find使用-mtime选项(可能与 一起-daystart)。

相关内容