Список всех недавно измененных файлов (рекурсивный)

21

Итак, я хочу отобразить ( lsнапример, через ) все файлы, которые были изменены за последние семь дней. Если я нахожусь в моей docroot-папке, она должна выглядеть "глубже".

Например:

File        Last changed
docroot
|- myfile1  30.11.2015
|- myfile2  10.11.2015
|- MySub
   |-sub1   30.11.2015
   |-sub2   10.11.2015

Таким образом, ls(или все, что подходит) должен выводить myfile1и (если это возможно) MySub/sub1.

Это выполнимо с одной командой?

DasSaffe
источник

Ответы:

39

Конечно. Из каталога, в котором вы находитесь:

find . -type f -mtime -7 -exec ls -l {} \; 

Добавьте к нему перенаправление (иначе, > results.txtчтобы сохранить их в этом файле).

  • type f делает только файлы, а не каталоги
  • mtime -7 делает 7 дней назад до сих пор (+7 будет «старше 7 дней»)
  • и затем передает его, lsчтобы показать длинный список

Вы также можете сыграть ls -lроль:

find . -type f -mtime -7 -exec ls -Rl --time-style=long-iso {} \; 
find . -type f -mtime -7 -exec ls -R  --time-style=long-iso {} \; 

покажет древовидный метод с каталогами между файлами в длинном списке (1) или коротком списке (2).

Rinzwind
источник
4
findесть lsвариант, чтобы вы могли просто сделатьfind . -type f -mtime -7 -ls
Heemayl
Конечно, но это делает его немного более общим (я использую этот метод для поиска файлов, которые мне нужны для -remove-, и могу изменить эту команду, чтобы сделать это :))
Rinzwind
3
Также более уместно использовать тот, find ... -exec ls -l {} +который выполняется ls -lнамного эффективнее - меньше раз с несколькими параметрами. Это стандартная опция, findуказанная в POSIX.
Пабук
5

С zsh:

ls -l **/*(.m-7)
  • **/* будет искать файлы рекурсивно, начиная с текущего каталога

  • (.m-7)является квалификатором глобуса, где .указывает обычный файл, m-7указывает файлы, которые были изменены в течение последних 7 дней

heemayl
источник
2

Следующая команда работает мечта на Mac OSX - может быть, также на Ubuntu ...

find . -type f -mtime -7 -exec stat -lt "%Y-%m-%d %H:%M:%S" {} \; | cut -d\  -f6- | sort -r

Это находит файлы в текущем дереве каталогов, которые были изменены за последние 7 дней, выводит дату модификации + время и путь, отсортированные сначала самыми новыми.

Пример вывода:

2018-02-21 22:06:30 ./fmxmlsnippet.xml
2018-02-19 12:56:01 ./diff.html
2018-02-19 12:44:37 ./temp/iDDR/XMSC_fmxmlsnippet.xml
2018-02-18 22:04:05 ./temp/iDDR/XMFD_fmxmlsnippet.xml
2018-02-15 10:18:27 ./xml/iDDR/XML2_fmxmlsnippet.xml
2018-02-15 10:13:29 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout.xsl
2018-02-15 10:11:36 ./xsl/.DS_Store
2018-02-15 10:10:51 ./xsl/_inc/inc.XML2_fmCM_ReportReferencesToExternalFiles.xsl
2018-02-15 10:10:09 ./xsl/_inc/.DS_Store
2018-02-15 10:07:35 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout-NoAnchors.xsl
2018-02-15 10:07:35 ./xsl/_inc/inc.XML2_fmCM_AnalyseLayout.xsl

Буду благодарен за любые отзывы пользователей Ubuntu.

MrWatson
источник
Единственное решение, которое хорошо сработало для меня на Mac. Благодарность!
artnikpro
Добро пожаловать @artnikpro!
MrWatson
1

Не совсем то, о чем просили ... но гораздо легче запомнить ...

ls -alRt docroot

или

ls -alRt /path/to/top/level/directory
heynnema
источник
0

7 дней это 60 секунд * 60 минут * 24 часа * 7 дней = 604800 секунд

Узнать текущую дату в секундах (время эпохи Unix):

$ date +%s
1448876323

Вычтите 7 дней в секундах:

expr $(date +%s) - 604800
1448271548

Теперь возьмите statкоманду и напечатайте статистику для всех файлов в формате «имя + время в секундах» и используйте awkдля обрезки тех файлов, время модификации которых больше, чем та дата, которую мы рассчитали

$ stat --printf="%n %Y\n" $HOME/* | awk '$2 > 1448271265 {print $0}'
/home/xieerqi/1448428697574.png 1448429613
/home/xieerqi/1448763343273.png 1448763478
/home/xieerqi/1510DRIVE 1448352453
/home/xieerqi/addRemoveDistribution 1448666843
/home/xieerqi/add-update.awk 1448716356
/home/xieerqi/add-update.sh 1448625092

Особенно интересны последние 3 файла, потому что я знаю, что работал над ними менее 7 дней назад. Таким образом, я знаю, что это работает

Сергей Колодяжный
источник
2
Обратите внимание, что вместо awk '$2 > 1448271265 {print $0}'вас можно прямо сказать awk '$2 > 1448271265'. При истинном условии awk печатает текущую строку как действие по умолчанию.
Федорки