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


8

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

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

2013007000385を表すことになっていますか?2013年は年だと思いますが、0070003852月7日までどうですか。
Gilles「SO-邪悪なことをやめなさい」

@ギレス:と思われる20130207003851。正しくコピーできなかったか、...申し訳ありません。
Radek

回答:


10

find多くの日付入力フォーマットをサポートしています。取得する最も簡単な形式は、YYYYMMDD HH:MM:SSです。あなたはすでに正しい順序の数字を持っています、あなたがしなければならないことは最初のグループを抽出する${timestamp%??????}だけです${timestamp#????????}:(最後の6文字を除くすべてを取る; :最初の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出力フォーマットを制御するために使用します。によって決定された変更時刻の一部を出力します。場合で、あなたはUnixエポックからの秒数を取得します。以下に、タブで区切られた3つの列を出力します。時刻はソート可能な形式、ファイル名、時刻は人間が読める形式です。最初の列を削除し、予想されるすべてのファイル名に対応するのに十分なスペースでタブを置き換えます(必要に応じて40を調整します)。このコードは、ファイル名に改行やタブがないことを前提としています。%TXXX@cut -f 2-expand

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

検索部分のみfind -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'が私に面白い出力を与える-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek

@Radek申し訳ありませんが、それ%Tはmtime用で%Mあり、権限です。
Gilles「SO-邪悪なことをやめなさい」

綺麗な。スムーズに動作します。私の最終的なコードは、phpで出力をキャプチャして区切り文字として-を使用find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-する-ため、ファイル名と時刻を区切ることです。どうもありがとうございます。
Radek、

@Gillesそれは素晴らしいですが、あなたはtimestringを説明するならば、それはより多くのを助ける...
ラーフルパティル

@RahulPatil完了しました。さらに読みやすいbashメソッドも追加しました。
Gilles「SO-悪をやめる」

5

zsh

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

このnewer関数は、より新しいファイルに対してはtrueを返します$timestamp(ただし、zsh's zstatは1秒未満の精度をサポートしていません)。

次に、zshグロビング修飾子を使用するだけDです。ドットファイルを含め、.通常のファイルのみを考慮しOm、変更時刻順に並べ替え、選択するファイルを決定+newerするnewer関数を呼び出します。

ファイルのタイムスタンプも表示したい場合は、次のように変更できますnewer

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

ただし、ファイル名生成の結果にはタイムスタンプが含まれるため、これらをファイル名として使用することはできなくなります。


sshたとえば、これは動作しません。
evandrix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.