![列出存储在具有特定时间戳的文本文件中的文件名](https://linux22.com/image/12326/%E5%88%97%E5%87%BA%E5%AD%98%E5%82%A8%E5%9C%A8%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%97%B6%E9%97%B4%E6%88%B3%E7%9A%84%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D.png)
我已将几个文件名存储在一个文本文件中,名称为新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
)。