我想查找某个目录中最旧文件的年龄,如果此目录中没有任何文件,则返回 0。我还需要一个单行命令来完成它。到目前为止,这是我在目录中查找最旧文件的年龄(以秒为单位)的命令:
expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
问题是,如果没有文件,它会返回以下错误:
$ 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 "- ")
所以在这种情况下,我希望命令只返回 0 并抑制错误打印输出。
zsh
和perl
:_D
(如果您还想考虑隐藏文件(但不考虑),请添加 glob.
限定符)..
。请注意,对于符号链接,它考虑了它解析到的文件的修改时间。删除
-
glob 限定符中的 in 以考虑符号链接的修改时间(并使用(lstat$ARGV[0] && -M _)
inperl
来获取符号链接的年龄)。这给出了以天为单位的年龄。乘以 86400 得到秒数:
(N-Om[1])
:全局限定符:N
nullglob
:为那个 glob打开。因此,如果目录中没有文件,则扩展为空,导致perl
's-M
返回undef
。-
: 导致下一个全局限定符应用于符号链接的目标Om
:按修改时间反转(大写)顺序(所以从最旧到最新ls -rt
)[1]
: 只选择第一个匹配的文件-M file
:获取文件内容的年龄。0+
或86400*
强制转换为数字(对于这种undef
情况)。如果必须是一行:
stat -c %Y ./* 2>/dev/null
打印所有文件的时间戳,忽略错误(所以没有文件导致没有输出)使用 awk:
-v d="$(date +%s)"
将当前时间戳保存在变量中d
BEGIN {m=d}
初始化m
为d
$0 < m {m = $0}
跟踪最小值m
END {print d - m}
打印差异。