web-dev-qa-db-ja.com

Linuxで現在の日付のファイルを取得していますか?

通常date +%dは出力を提供します08現在の日付、2017年8月10日。しかし、私がls -lrtパス上では、日付形式はOct 8 15:03では、現在の日付のファイルを取得するにはどうすればよいですか?

コマンドを使用しています

ls -lrt XYZ.LOG* |grep "$(date +'%b %d')" |awk '{print $9}'

しかし、それは私に今日の日付(2017年10月8日)のファイルを与えていませんが、それは私に任意の月の日付10-31の正しい出力を与えます。

4
User123

これは少し不正行為ですが、うまくいきます。

最初に、特定のタイムスタンプ、つまり午前0時の空の参照ファイルを作成します。

touch -d "$(date +%FT00:00:00)" /tmp/midnight

次に、このファイルよりも新しいファイルを見つけます。

find . -type f -newer /tmp/midnight

パス名だけでなくlsからのfindのような出力が必要な場合:

find . -type f -newer /tmp/midnight -ls

パターンXYZ.LOG*に一致するファイルを検索する場合:

find . -type f -name 'XYZ.LOG*' -newer /tmp/midnight -ls

GNU findがある場合、一時ファイルをバイパスして使用できます

find . -type f -newermt 0

午前0時以降に変更されたファイルを取得します。


関連: `ls`を解析しない*理由*

6
Kusalananda

stat(1)を使用してファイルの変更時刻を取得できますが、これは移植性がありません。

Linuxの場合:

$ stat -c %y some_file
2017-09-23 10:24:09.880806666 +0200

$ date -d @$(stat -c %Y some_file) +%d-%m-%Y
23-09-2017

BSDの場合:

$ stat -f %Sm -t %d-%m-%Y some_file
23-09-2017
2
Satō Katsura

現在の日付のファイルを取得する方法?

lsコマンドには、特定の形式で時刻を出力する--time-styleオプションがあります。

ls -l --time-style=+'%d-%m-%Y' | awk -v d=$(date +%d-%m-%Y) '$6==d'

--time-style=[〜#〜]スタイル[〜#〜]
with -l、スタイルSTYLEを使用して時間を表示:full-iso、long-iso、iso、locale、または+ FORMAT; FORMATは'date'のように解釈されます。

1
RomanPerekhrest

zshでは、グロブ修飾子と age を使用します。

autoload age
print -rl ./**/XYZ.LOG*(e_'age today now'_)

または、長いリスト形式を希望する場合:

autoload age
ls -lrtd -- **/XYZ.LOG*(e_'age today now'_)
1
don_crissti

一般に、ls出力の解析はお勧めできません。関連: なぜnot解析ls


ほとんどの仕事ls答え

GNU lsを使用して今日のすべてのファイルを取得するための最も堅牢な方法は次のとおりです:

ls -lrt --time-style=+'%Y%m%d' * | grep " $(date +'%Y%m%d') "

これにより、各ファイルの日付形式が、区切り文字スペースを含むgrepによって確実に選択される1つのフィールドになります(これにより、日付として指定されたファイルが選択される可能性がなくなります(ただし、また、名前にスペースが含まれることはほとんどありませんが、まだ可能です)。

もちろん、ファイル名にスペースが含まれている場合、awk {print $7}を使用したlsの出力の解析は影響を受け、失敗します(より多くのフィールド)(touch ' 20171008 test'として作成されたファイルで試してください)。

単純な(GNU)検索を使用する

質問されたのは今日の日付のファイル(1日)だったので、findの-mtime(for変更日、または他の2つの場合は-atimeまたは-ctime

$ find . -daystart -type f -mtime -1 -not -mtime -0 -print

-daystartオプションは、時間間隔が午前0時からであることを確認します。
a -mtime -1は、1日前(およびそれ以降、つまり今日)のファイルを選択します。
_-not -mtime -0は今後ファイルを拒否します。

それほど簡単ではありません

範囲内の時間(丸一日に限定されない)が必要な場合、この呪文が役立つ場合があります。

find ./ -type f -newermt "$dstart" -not  -newermt "$dend" -print

ここで、dstartおよびdendには、開始および終了の時間制限が含まれています。

dstart=$( date -d '20171006 22:10:12' )
dend=$(   date -d '20171008 20:10:12' )
find ./ -type f -newermt "$dstart" -not  -newermt "$dend" -print
0
Isaac