最新のファイルを見つける

最新のファイルを見つける

特定のディレクトリ内で最後にアクセスしたファイルを見つけるにはどうすればよいですか?

このfindコマンドを使用して、過去n数分間に変更/アクセスされたすべてのファイルを一覧表示できます。しかし、私の場合、最後のファイルがいつ変更/アクセスされたかはわかりません。必要なのは、他のすべてのサブファイルまたはサブディレクトリの中で、最近アクセス/変更されたすべてのファイルを、たとえばアクセス/変更時刻で並べ替えて一覧表示することだけです。

それは可能ですか?

答え1

最後にアクセスした 3 つのファイルを印刷するには (最後にアクセスしたファイルから 3 番目にアクセスしたファイルまで並べ替えます)。

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'

最後に変更された 3 つのファイルを印刷するには (最後に変更されたファイルから 3 番目に変更されたファイルまで並べ替えます)。

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
  • find . -type f -exec stat -c '%X %n' {} \;: 現在のディレクトリ階層内の各ファイルの最終アクセス時刻とファイルパスを出力します。
  • find . -type f -exec stat -c '%Y %n' {} \;: 現在のディレクトリ階層内の各ファイルの最終変更時刻とファイルパスを出力します。
  • sort -nr: 逆数値順にソートします。
  • cut -d' ' -f2-: 2 番目のフィールド以降、スペースで区切られたすべてのフィールドを出力します。
  • awk 'NR==1,NR==3 {print}': 範囲 #1-3 の行を出力します。

で 3 を希望のファイル数に変更することで、表示するファイルの数を変更できますawk 'NR==1,NR==3 {print}'

この回答はGNU版に基づいているため、BSDベースのシステムのユーザーは、関連するタイムスタンプを印刷するためにコマンドstatのフォーマット文字列を変更する必要があります。stat

~ % touch file\ 1
~ % touch file\ 2
~ % touch file\ 3
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % cat file\ 1
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 1
./file 3
./file 2
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % touch file\ 2
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 2
./file 1
./file 3
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 2
./file 3
./file 1

答え2

特定のディレクトリ内のファイルを変更日時順(最新のものから順に)に並べ替える場合:

ls -t

アクセス時間で並べ替えるには、-uオプションを追加します。

ls -tu

ただし、現代のLinuxシステムはデフォルトでは正確なアクセス時間を追跡しないそのため、アクセス タイムスタンプは信頼できない可能性があります。

サブディレクトリを含むディレクトリツリー内の最新のファイルを見つけたい場合、最も簡単な方法はzshのglob 修飾子

print -lr -- **/*(om)

oaの代わりにを使用すると、変更時刻ではなくアクセス時刻が使用されますom。たとえば、最新の 10 個のファイルを取得するなど、一致を制限できます。

print -lr -- **/*(om[1,10])

これらは隠しファイルをスキップします。隠しファイルも考慮したい場合は、Dglob修飾子を追加します。また、.glob修飾子を追加して、隠しファイルのみを考慮することもできます。通常ファイル(シンボリックリンク、ディレクトリ、FIFO などは考慮しません)、またはmm-60過去mh-11 時間以内に最後に変更されたファイルに制限します。

答え3

再帰スイッチ ( -R) をls時間によるソートスイッチ ( -t) および逆ソートスイッチ ( -r) とともに使用して、ディレクトリツリー内のすべてのファイルをリスト表示することができます。これにより、サブディレクトリ全体のすべてのファイルがアクセス/変更日付でソートされるのではなく、各サブディレクトリ内で個別にこの日付でソートされます。

次のようなコマンドを使用しますls -ltrR <sometopdir>

$ ls -ltrR .
total 759720
-rw-r-----@  1 sammingolelli  staff    2514441 Mar 31  2015 restfulapi-120704053212-phpapp01.pdf
-rw-r-----@  1 sammingolelli  staff     567808 Apr  7  2015 USGCB-Windows-Settings.xls
-rw-r-----@  1 sammingolelli  staff     180736 Apr  7  2015 USGCB-RHEL5-Desktop-Settings-Version-1.2.5.0.xls
-rw-r-----@  1 sammingolelli  staff       6474 Apr  8  2015 tap_kp_mavericks.txt

./kerberos:
total 5464
-rw-r-----@ 1 sammingolelli  staff    37317 Oct  2 13:03 Set_up_Kerberos_instruction_d8.docx
-rw-r-----@ 1 sammingolelli  staff  2753195 Oct 13 13:49 Keberos configuration with AD 01_09_2014.pdf

./homestarrunner:
total 10624
-rw-rw-rw-@ 1 sammingolelli  staff   319422 May 10  2000 error_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    53499 Jun  8  2001 sb_duck.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   199254 Mar 11  2002 email_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff    39288 Mar 25  2002 bubs_dontutalk.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    75432 May  6  2002 trash_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298946 Dec  1  2002 error_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298686 Dec  1  2002 startup_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    90279 Dec  1  2002 sb_meedlymee.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    73561 Dec  1  2002 sb_dubdeuce.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   193097 Dec  1  2002 sb_pizza.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    30093 Dec  1  2002 sb_stiny.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61858 Dec  1  2002 ss_sadflying.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   150142 Dec  1  2002 email_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    68545 Dec  1  2002 bubs_grabbinbutt.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61022 Dec  1  2002 cz_jeorghb.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    40124 Dec  1  2002 marzy_nasty.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   224116 Dec  1  2002 shutdown_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   260546 Dec  1  2002 shutdown_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    57686 Dec  1  2002 trash_hs.wav

答え4

ファイル ツリー内の場所に関係なく、「最近の」ファイルの完全なセットをアクセス/変更時間で並べ替えたいですか?

これを行う 1 つの方法は、 を使用してstat各ファイルの変更時刻をsort結果ごとに印刷し、次にcut結果から変更時刻を印刷することです。

これは、名前に改行が含まれているファイルの場合は機能しませんが、他のファイルの場合は、最近 60 分以内に変更されたファイルを最新のものから最も古いものの順に一覧表示するソリューションがあります。

find . -type f -mmin -60 -exec stat -c $'%Y\t%n' {} + | sort -nr | cut -f2-

関連情報