通常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の正しい出力を与えます。
これは少し不正行為ですが、うまくいきます。
最初に、特定のタイムスタンプ、つまり午前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`を解析しない*理由*
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
現在の日付のファイルを取得する方法?
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'
のように解釈されます。
zsh
では、グロブ修飾子と age
を使用します。
autoload age
print -rl ./**/XYZ.LOG*(e_'age today now'_)
または、長いリスト形式を希望する場合:
autoload age
ls -lrtd -- **/XYZ.LOG*(e_'age today now'_)
一般に、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'
として作成されたファイルで試してください)。
質問されたのは今日の日付のファイル(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