以下より最新のすべてのファイルを一覧表示したい(日付順に並べ替え)。タイムスタンプ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
/tmp -newermt "2013年2月7日" -lsを探す欲しいファイルがリストされていますが、
- 20130207003851形式のタイムスタンプを使用する方法
- 出力をどのようにソートしますか?
- ファイル名と日付のみを表示するにはどうすればよいですか?ファイル名が最初で、日付が次ですか?
ps。ルックアップ用の参照ファイルを生成するためにタッチを使用したくありません。
シェン
find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
答え1
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
出力形式を制御します。決定された修正時間の割合を印刷します。その場合、Unix時代以降の秒数を取得します。以下では、並べ替え可能な形式の時間、ファイル名、および人間が読める形式の時間という3つのタブで区切られた列を印刷します。最初の列を削除し、予想されるすべてのファイル名を収容するのに十分なスペースを持つタブの置き換えを呼び出します(必要に応じて40調整)。このコードは、ファイル名に改行やタブがないと想定しています。%TX
X
X
@
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
答え2
そして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
(ただし、1秒未満の精度ではサポートされzsh
ていません)。zstat
それから私たちがしなければならないのは、zsh
globbing修飾子を使うことです。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 ))
}
ファイル名の生成結果にはタイムスタンプが含まれているため、ファイル名として使用できなくなります。