web-dev-qa-db-ja.com

1行で最も古いファイルの経過時間を検索するか、ゼロを返します

特定のディレクトリで最も古いファイルの経過時間を検索するか、このディレクトリにファイルがない場合は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 "- ")

したがって、この場合、コマンドが0だけを返し、エラーの出力を抑制したいと思います。

4

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}_ mdに初期化します
    • _$0 < m {m = $0}_ mの最小値を追跡する
    • _END {print d - m}_差を出力します。
4
muru

zshおよびPerlの場合:

Perl -le 'print 0+-M $ARGV[0]' /path/to/dir/*(N-Om[1])

(隠しファイルも考慮したい場合は、D glob修飾子を追加します(ただし、...も考慮しません))。

シンボリックリンクの場合、それは解決先のファイルの変更時間を考慮することに注意してください。グロブ修飾子の-を削除して、代わりにシンボリックリンクの変更時間を考慮してください(Perl(lstat$ARGV[0] && -M _)を使用して、シンボリックリンクの経過時間を取得してください)。

それは日数で年齢を与えます。 86400を掛けて、秒数を取得します。

Perl -le 'print 86400*-M $ARGV[0]' /path/to/dir/*(N-Om[1])
  • (N-Om[1]):グロブ修飾子:
    • N:そのグロブのnullglobをオンにします。したがって、ディレクトリにファイルがない場合は、何にも展開されず、Perl-Mundefを返します。
    • -:次のグロブ修飾子をシンボリックリンクのターゲットに適用します
    • Om:変更時間による逆(大文字)の順序(つまり、ls -rtのように古いものから新しいものへ)
    • [1]:最初に一致したファイルのみを選択
  • -M file:ファイルのコンテンツの古さを取得します。
  • 0+または86400*は強制的に数値に変換します(undefの場合)。
6