我正在尝试考虑一个命令或脚本,它可以在目录中找到最新的文件,并仅当文件早于“X”小时时才打印其路径。
这背后的想法是脚本仅在早于“X”小时时才返回值(最新文件的路径)。如果它没有返回任何内容,则应该意味着最新的文件比指定的时间更年轻。
答案1
在zsh
shell 中,以下文件名通配模式将匹配任何非隐藏名称:
*
以下内容将匹配任何具有非隐藏名称的常规文件。
*(.)
要使其起到nullglob
in 的作用bash
,请添加限定符N
。D
如果您想匹配隐藏名称,还可以添加(如“点文件”中所示):
*(.ND)
添加mh+3
以仅匹配 4 小时或更长时间前修改的常规文件的名称:
*(.NDmh+3)
按 mtime 时间戳对匹配名称进行排序:
*(.NDmh+3om)
选择名字(最近修改的):
*(.NDmh+3om[1])
从bash
:
zsh -c 'print -rC1 some/dir/path/*(.NDmh+3om[1])'
答案2
这使用stat
GNU coreutils
# use stat to find the mtime of the newest file
read -r age name < <(stat -c $'%Y\t%n' * | sort -nr | head -1)
# number of hours, get the limit epoch time
hrs=4
limit=$((EPOCHSECONDS - hrs * 3600))
# print the filename if it's older
((age < limit)) && echo "$name"
假设
- 您的 $PWD 是有问题的目录
- 您的文件名不包含换行符
- 你的 bash 版本是......最新的(不确定何时引入 EPOCHSECONDS 变量)
答案3
虽然使用 stat 的另一种解决方案更干净,但我决定发布一条简短的内容,因为我认为它很有趣并且也有效。
find -maxdepth 1 -mmin -60 -type f | grep -q . || ls -tr | tail -1
为了解释这是如何工作的,首先我列出了“较新的文件”范围内的所有文件。如果发现任何内容,将grep -q .
不输出任何内容并结束执行。但是,如果它没有输出任何内容,grep 将返回错误代码,因此或(“||”)将导致运行ls -tr | tail -1
,这将显示目录中最旧的条目。