web-dev-qa-db-ja.com

最新の日付と日付が変更されたファイルを検索し、sedを使用する

日付を含む一連のファイルがあり、最新の日付と最新の日付変更を含むファイルを取得して、sedにパイプする必要があります。私はさまざまなアプローチを試しましたが、うまくいくものが得られないようです。

例えば:

find . -iname '*2014-09-20*' -type f -exec ls -lrt {} \; -exec tail -1 {} \; -exec sed -n -e '/some test/,/some other text/p' {} \;

find . -iname '*2014-09-20*' -type f | xargs ls -lrt | tail -1 | sed -n -e '/some text/,/some other text/p'

ログファイルは次のようになります

-rw-r--r--. 1 root root  23042 Sep 18 14:21 logfilename_2014-09-19_20140918141909.log
-rw-r--r--. 1 root root   2343 Sep 18 14:22 logfilename_2014-09-20_20140918142142.log
-rw-r--r--. 1 root root   2343 Sep 18 14:23 logfilename_2014-09-21_20140918142245.log
-rw-r--r--. 1 root root   2343 Sep 19 10:11 logfilename_2014-09-20_20140919101031.log
-rw-r--r--. 1 root root   2343 Sep 19 10:12 logfilename_2014-09-21_20140919101122.log
-rw-r--r--. 1 root root   2343 Sep 19 10:13 logfilename_2014-09-22_20140919101218.log

出力は次のようになると思います。

TEXT 1

line
line
line
line

TEXT 2

これを行うと機能します:

sed -n -e '/TEXT 1/,/TEXT 2/p' logfilename_2014-09-20_20140919101031.log

しかし、前述のcmdからsedに結果をパイプすると、結果が得られません。これは私がこれまでに試したことです:

find . -iname '*2014-09-19*' -type f | xargs stat --format '%Y : %y %n' | sort -nr | cut -d: -f2- | head -1 | sed -n -e '/TEXT 1/,/TEXT 2/p'

find . -iname '*2014-09-19*' -printf "%T@\t%p\n" | sort | awk -F"\t" '{print $NF}' | tail -1 | sed -n -e '/TEXT 1/,/TEXT 2/p'
1
Ptrkcon

最も単純なアプローチ(ただし、ファイルにスペース、改行、またはその他の奇妙な文字が含まれている場合は失敗します)

ls -ltr '*2014-09-20*' | tail -n 1

より安全な方法は

find . -printf "%T@\t%p\n" | sort | awk -F"\t" '{print $NF}'
1
terdon

最新の変更時刻のファイルを使用する必要がある場合、最も簡単なアプローチは、他のシェルの代わりに zsh を使用し、その glob qualifiersomを使用して一致を並べ替えることです。最初の一致のみを保持するための変更時間と_[1]_。

_echo *2014-09-20*(om[1])
_

ファイル名のタイムスタンプ部分に基づいて最新のタイムスタンプが必要な場合は、通常の並べ替えで十分です。次の関数は、最後の引数に作用します。

_act_on_last_file () {
  eval 'set -- "${'"$#"'}"'
  echo "$1"
}
act_on_last_file *2014-09-20*
_