Найти последние файлы

Найти последние файлы

Как узнать последний открытый файл в заданном каталоге?

Я могу использовать findкоманду для вывода списка всех файлов, измененных/полученных доступом за последние nминуты. Но в моем случае я не уверен, когда последний файл был изменен/получен доступ? Все, что мне нужно, это вывести список всех файлов, которые были доступны/изменены совсем недавно среди всех других подфайлов или подкаталогов, отсортированных по времени доступа/изменения, например.

Это возможно?

решение1

Чтобы распечатать последние 3 открытых файла (с сортировкой от последнего открытого файла до третьего по счету открытого файла):

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

Чтобы распечатать последние 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-: печатает все поля, разделенные пробелами, начиная со второго поля;
  • awk 'NR==1,NR==3 {print}': печатает строки в диапазоне № 1–3.

Вы можете изменить количество отображаемых файлов, изменив 3 на желаемое количество файлов в формате awk 'NR==1,NR==3 {print}'.

Этот ответ основан на версии GNU stat, поэтому пользователям систем на базе BSD придется изменить строку формата 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])

Они пропускают скрытые файлы. Если вы хотите также учитывать скрытые файлы, добавьте Dквалификатор glob. Вы также можете добавить квалификатор .glob, чтобы учитывать толькообычныйфайлы (не учитывая символические ссылки, каталоги, fifo...), и mm-60или mh-1ограничить файлы, последний раз измененные в течение последнего часа.

решение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

Хотите отсортировать полный набор «последних» файлов по времени доступа/изменения, независимо от их расположения в файловом дереве?

Один из способов сделать это — использовать statдля вывода времени изменения каждого файла sortпо результату, а затем cutвремени изменения из результатов.

Это не сработает для файлов, содержащих в своих именах новые строки, но для других файлов вот решение, которое выведет список файлов, измененных за последние 60 минут, отсортированных от самых последних к наименее измененным:

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

Связанный контент