web-dev-qa-db-ja.com

ディレクトリの「再帰的」最終更新日

ディレクトリ内の最後に変更されたファイルのタイムスタンプを取得する(そしておそらくその出力をフォーマットする)Linux bashのコマンドまたは関数を知りたいのですが。

/ path/mydirがあり、このディレクトリ内に大量のファイルがあるとしましょう。そのパスを考慮して、最後に変更されたファイルのタイムスタンプを出力します。

この手順では、foreachファイルを再帰的に実行し、すべてをチェックして、最新のものが見つかるたびに最新の時刻で変数を更新できると思います。

編集:混乱のため申し訳ありませんが、私はエポックのタイムスタンプを意図したかった:)

6
user3450548

1つのオプション:GNU findを使用してすべてのファイルを再帰的に検索し、ファイルパスを使用してタイムスタンプを印刷し、日付でソートします。

find /path/mydir -printf "%T+\t%p\n" | sort | tail -1

エポックのタイムスタンプだけの場合、

find /path/mydir -printf "%T@\n" | sort | tail -1
8
user4556274

linux タグと bash タグ、および質問の「linux bash」の仕様を考慮して、ファイル名とタイムスタンプの両方を出力するbash固有の関数を次に示します指定されたディレクトリ構造で最も最近変更されたファイル:

function lastmodified () (
  shopt -s globstar
  latest=
  t=0
  for f in "$1"/**
  do
    x=$(stat -c "%Y" "$f")
    if [ $x -gt $t ]
    then
      latest="$f"
      t="$x"
    fi
  done
  printf "%s\n" "$latest"
  printf "%s\n" "$(date -d @${t})"
)

lastmodified /path/mydirのように使用してください。

これはサブシェルで実行され、 globstarシェルオプション およびさまざまな変数の割り当てを分離します。 printfステートメントを変更または削除して、必要なデータをキャプチャします。

これは、bashに指定された$1パラメータの下のすべてのファイル名のパスを展開するように要求し、次に stat コマンドで「最終変更時刻をエポックからの秒数」としてチェックします。最新のファイル名は$latestになり、タイムスタンプはtになります。

2
Jeff Schaller

zsh がインストールされていることを確認します(すべての主要なディストリビューションにはパッケージが含まれています)。

zsh -c 'ls -log **/*(.om[1])' | awk '{print $4, $5, $6}'

**/*ワイルドカードパターン であり、サブディレクトリ内のすべてのファイルを再帰的に照合し、(.om[1]) are glob qualifiers 一致を通常のファイル(.)、変更時間(om)で並べ替え、最新のファイルのみを保持([1])。 Glob修飾子は固有のzsh機能であり、その機能の多く、特にソートは、他のシェルでは再現するのが困難です。

通常必要なのは通常のファイルのみです。ただし、.修飾子。たとえば、ファイルが最後に削除された時刻をタイムスタンプに反映させる場合。

GNU lsには、時刻形式を制御するオプションがあります(--time-style)。時間形式によっては、時間フィールドを抽出するために後処理を調整する必要がある場合があります。

または、Linuxのstatコマンドまたは zsh's stat builtin を使用して、タイムスタンプを目的の形式で出力できます。

zsh -c 'zmodload zsh/stat; stat +mtime -- **/*(.om[1])'
find . -type f -exec ls -ltr {} \; | awk '{print $6"-"$7"-"$8" "$9}' | sort -k3 | sort -nr | head -1

出力形式はMonth-date-hour-minute filename

Dec-30-03:10 ./1

ファイルは今年作成されたため、年は表示されていません。年を常に表示したい場合は、常に年を表示するようにコードを変更できます。

1