行で最も古いファイルの年齢を検索するか、0を返します。

行で最も古いファイルの年齢を検索するか、0を返します。

特定のディレクトリで最も古いファイルの年齢を探したい場合、またはディレクトリにファイルがない場合は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

そして:zshperl

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]):グローバル修飾子:
    • Nnullglob:この球に対して開いています。したがって、ディレクトリにファイルが含まれていない場合は、拡張機能が空のために返されperlます。-Mundef
    • -: 次のグローバル修飾子がシンボリックリンクの宛先に適用されます。
    • Om:修正時間による逆方向(大文字)の順序(例:最も古いものから最新のものまでls -rt
    • [1]:一致する最初のファイルのみを選択
  • -M file:ファイル内容の年齢を取得します。
  • 0+または86400*(このundef場合)数字にキャストします。

おすすめ記事