在一行中查找最旧文件的年龄或返回零

Geo*_*nov 4 directory shell-script files

我想找到某个目录中最旧文件的年龄,如果该目录中没有任何文件,则返回 0。我还需要一个单行命令来完成它。到目前为止,这是我用于查找目录中最旧文件的年龄(以秒为单位)的命令:

expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
Run Code Online (Sandbox Code Playgroud)

问题是,如果没有文件,它会返回以下错误:

$ expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
stat: cannot stat ‘0’: No such file or directory
-bash: 1554373460 - : syntax error: operand expected (error token is "- ")
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,我希望命令只返回 0 并抑制错误打印输出。

Sté*_*las 6

随着zshperl

perl -le 'print 0+-M $ARGV[0]' /path/to/dir/*(N-Om[1])
Run Code Online (Sandbox Code Playgroud)

D如果您还想考虑隐藏文件(但不是.也不是..),请添加glob 限定符)。

请注意,对于符号链接,它考虑了它解析到的文件的修改时间。删除-glob 限定符中的in 以考虑符号链接的修改时间(并使用(lstat$ARGV[0] && -M _)inperl获取符号链接的年龄)。

这给出了以天为单位的年龄。乘以 86400 得到秒数:

perl -le 'print 86400*-M $ARGV[0]' /path/to/dir/*(N-Om[1])
Run Code Online (Sandbox Code Playgroud)
  • (N-Om[1]):全局限定符:
    • N: 打开nullglob那个 glob。因此,如果目录中没有文件,则扩展为无导致perl's-M返回undef
    • -: 导致下一个 glob 限定符应用于符号链接的目标
    • Om:按修改时间反转(大写)顺序(所以从最旧到最新ls -rt
    • [1]: 只选择第一个匹配的文件
  • -M file: 获取文件内容的年龄。
  • 0+86400*强制转换为数字(对于这种undef情况)。

  • @GeorgеStoyanov,语法用于`zsh`,而不是`bash`。 (2认同)