web-dev-qa-db-ja.com

指定されたタイムスタンプよりも新しいすべてのファイルをリストし、それらを並べ替えます

timestampより新しいすべてのファイル(日付順)を一覧表示したいのですが、/ tmpディレクトリの20130207003851の形式でのみです。サブディレクトリは省略できます。

SUSE Linux Enterprise Server 11。

出力フォーマットは

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find/tmp -newermt "7 feb 2013" -ls必要なファイルをリストしますが

  • タイムスタンプを20130207003851の形式で使用する方法
  • 出力を並べ替えるにはどうすればよいですか?
  • ファイル名と日付のみを表示するにはどうすればよいですか。最初にファイル名、次に日付?

pS私はタッチを使用して検索用の参照ファイルを作成したくない

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
8
Radek

findは、多くの 日付入力形式 をサポートしています。取得する最も簡単な形式は、YYYYMMDD HH:MM:SSです。あなたはすでに正しい順序の数字を持っています、あなたがしなければならないすべては最初のグループを抽出することです(${timestamp%??????}:最後の6文字を除くすべてを取る; ${timestamp#????????}:最初の8文字以外すべてを取る)、続けて、句読点を追加してから、次のグループに進みます。

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

Bash(およびkshとzsh)では、ashではなく、より読みやすい${STRING_VARIABLE:OFFSET:LENGTH}構文を使用できます。

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

日付でファイルを並べ替えるには、日付が前に付いたファイル名を印刷して並べ替え、日付のプレフィックスを削除します。 -printf を使用して、出力形式を制御します。 %TXは、Xによって決定される変更時刻の一部を出力します。 X@の場合、UNIXエポックからの秒数を取得します。以下に、タブで区切られた3つの列を出力します。時刻はソート可能な形式で、ファイル名は時刻で、人が読める形式で表示されます。 cut -f 2-は最初の列を削除し、expandの呼び出しはタブをすべての予期されるファイル名に対応するのに十分なスペースに置き換えます(必要に応じて40を調整します)。このコードは、ファイル名に改行やタブがないことを前提としています。

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40