脚本 - 查找目录中的最新文件是否早于“X”小时

脚本 - 查找目录中的最新文件是否早于“X”小时

我正在尝试考虑一个命令或脚本,它可以在目录中找到最新的文件,并仅当文件早于“X”小时时才打印其路径。

这背后的想法是脚本仅在早于“X”小时时才返回值(最新文件的路径)。如果它没有返回任何内容,则应该意味着最新的文件比指定的时间更年轻。

答案1

zshshell 中,以下文件名通配模式将匹配任何非隐藏名称:

*

以下内容将匹配任何具有非隐藏名称的常规文件。

*(.)

要使其起到nullglobin 的作用bash,请添加限定符ND如果您想匹配隐藏名称,还可以添加(如“点文件”中所示):

*(.ND)

添加mh+3以仅匹配 4 小时或更长时间前修改的常规文件的名称:

*(.NDmh+3)

按 mtime 时间戳对匹配名称进行排序:

*(.NDmh+3om)

选择名字(最近修改的):

*(.NDmh+3om[1])

bash

zsh -c 'print -rC1 some/dir/path/*(.NDmh+3om[1])'

答案2

这使用statGNU 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,这将显示目录中最旧的条目。

相关内容