特定のディレクトリで最も古いファイルの年齢を探したい場合、またはディレクトリにファイルがない場合は0を返したいと思います。また、これを行うには1行のコマンドが必要です。これまでは、ディレクトリ内の最も古いファイルの期間(秒単位)を見つけるために使用するコマンドです。
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 "- ")
したがって、この場合、コマンドはゼロを返し、エラー出力を抑制したいと思います。
答え1
そして:zsh
perl
perl -le 'print 0+-M $ARGV[0]' /path/to/dir/*(N-Om[1])
D
(隠しファイルも考慮したい場合は(しかし除く.
)..
glob修飾子を追加してください。)
シンボリックリンクの場合、解釈されるファイルの修正時間が考慮されます。-
シンボリックリンクの修正時間を説明するには、glob修飾子からinを削除します(そしてシンボリックリンクの寿命を得るには(lstat$ARGV[0] && -M _)
inを使用してください)。perl
これは日単位の年齢を提供します。秒数を取得するには、86400を掛けます。
perl -le 'print 86400*-M $ARGV[0]' /path/to/dir/*(N-Om[1])
(N-Om[1])
:グローバル修飾子:N
nullglob
:この球に対して開いています。したがって、ディレクトリにファイルが含まれていない場合は、拡張機能が空のために返されperl
ます。-M
undef
-
: 次のグローバル修飾子がシンボリックリンクの宛先に適用されます。Om
:修正時間による逆方向(大文字)の順序(例:最も古いものから最新のものまでls -rt
)[1]
:一致する最初のファイルのみを選択
-M file
:ファイル内容の年齢を取得します。0+
または86400*
(このundef
場合)数字にキャストします。
答え2
1行でなければならない場合:
stat -c %Y ./* 2>/dev/null | awk -v d="$(date +%s)" 'BEGIN {m=d} $0 < m {m = $0} END {print d - m}'
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}
印刷の違い。