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 并抑制错误打印输出。
随着zsh
和perl
:
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
情况)。