Как перечислить файлы, отсортированные по дате модификации рекурсивно (никакая доступная команда статистики!)

check-update команда обновит индекс пакета и проверку на доступные обновления:

yum check-update
31
14.03.2011, 21:01
6 ответов

Мой самый короткий метод использует zsh:

print -rl -- **/*(.Om)

(добавьте D спецификаторы шарика, если Вы также хотите перечислить скрытые файлы или файлы в скрытых каталогах).

Если у Вас есть GNU, находят, заставляют его распечатать время изменения файла и вид этим. Я предполагаю, что в именах файлов нет никаких новых строк.

find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'

Если у Вас есть Perl (снова, не принимая новых строк в именах файлов):

find . -type f -print |
perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        print sort {$_{$b} <=> $_{$a}} keys %_;  # print by decreasing age
    }'

Если у Вас есть Python (снова, не принимая новых строк в именах файлов):

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'

Если Вы имеете доступ SSH к тому серверу, монтируете каталог по sshfs на лучше оборудованной машине:

mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt

Только с инструментами POSIX это намного более сложно, потому что нет никакого хорошего способа найти время изменения файла. Единственный стандартный способ получить времена файла ls, и выходной формат зависим от локали и труден проанализировать.

Если можно записать в файлы, и Вы только заботитесь о регулярных файлах, и в именах файлов нет никаких новых строк, вот ужасный клудж: создайте жесткие ссылки на все файлы в единственном каталоге и отсортируйте их ко времени изменения.

set -ef                       # disable globbing
IFS='
'                             # split $(foo) only at newlines
set -- $(find . -type f)      # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do                     # hard link the files to links.tmp/0, links.tmp/1, …
  ln "../$f" $i
  i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do  # for each file, in reverse mtime order:
  eval 'list="${'$i'}         # prepend the file name to $list
$list"'
done
printf %s "$list"             # print the output
rm -f [0-9]*                  # clean up
cd ..
rmdir links.tmp
27
27.01.2020, 19:37
  • 1
    Самый легкий путь, вероятно, find . -print | xargs -n99999 -s999999 ls -ltr. Но это имеет проблему тот (1) xargs может не позволить -m больше, чем 512 или -s больше, чем 5 120, и (b), даже если можно обойти это, существует все еще наложенный ядром максимальный размер объединенного списка аргументов и среды. Большинство Ваших идей (сохраняют Perl и Python) имеет ту же проблему, которая является, почему я конкретно постарался не создавать долгие командные строки. –  geekosaur 15.03.2011, 00:49
  • 2
    В частности, я регулярно получаю "список аргументов слишком долго" ошибки с помощью zsh рекурсивные шарики в общем случае. –  geekosaur 15.03.2011, 00:51
  • 3
    @geekosaur: Только последний ужасный клудж имеет проблему с долгими командными строками. В zsh можно сделать много с созданным-ins (например. print -rl **/*только предел - то, сколько свободной памяти Вы имеете), и кроме того существует zargs. Ваше предложение find … | xargs … ls отсортирует правильно если xargs заканчивает тем, что вызвал ls только однажды, и не будет работать, если будут специальные символы в именах файлов. –  Gilles 'SO- stop being evil' 15.03.2011, 01:00
  • 4
    за чрезвычайно подробный ответ с партией опций! :) –  alex 15.03.2011, 08:35
  • 5
    , И вот почему я люблю zsh. –  Profpatsch 08.11.2013, 22:35

Принятие GNU find:

find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-

Изменение 1n,1 кому: 1nr,1 если Вы хотите файлы, перечисленные новый сначала.

Если у Вас нет GNU find это становится более трудным потому что lsформат метки времени варьируется так (недавно измененные файлы имеют другой стиль метки времени, например).

14
27.01.2020, 19:37
  • 1
    На самом деле можно также изменить формат даты и времени с ls --time-style="..." - Я не уверен, стандартно ли это или GNU ls, вероятный GNU. –  asoundmove 15.03.2011, 00:22
  • 2
    Определенно GNU. –  geekosaur 15.03.2011, 00:28
  • 3
    @asoundmove: к сожалению, поле слишком старо (RedHat 7.2) и ls не имеет той опции. большое спасибо –  alex 15.03.2011, 08:19

На Mac нет никакого-printf аргумента для нахождения, но можно сделать это вместо этого:

find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'

7
27.01.2020, 19:37
[112485] можно попробовать (нужно собрать самому) [112959] https://github.com/shadkam/recentmost

0
27.01.2020, 19:37

Игнорирование скрытых файлов - с красивой и быстрой меткой времени

Хорошо обрабатывает пробелы в именах файлов - не то чтобы вы должны их использовать!

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht

Больше find galore можно найти по ссылке.

0
27.01.2020, 19:37

Если говорить в целом о поиске файлов по дате (, это не сработает для оригинального плаката, но я оказался здесь, поэтому подумал, что другие тоже могут ). В моем случае использования я хочу перечислить файлы с целью их просмотра перед удалением.

С findutils 4.6.0 мне нравится:

find. -type f -mtime +270 -exec ls -laFGht --time-style=iso {} \+

Приведенная выше команда находит файлы(-type f)в текущем рабочем каталоге (.), которые были изменены более 270 дней назад.(-mtime +270Также -mtime 0выдает последние 24 часа, а -mtime -5показывает последние 5 дней ). Затем он использует ls, чтобы перечислить их по дате, сначала самые новые (-exec ls -laFGht --time-style=iso {} \+)

.

Вот пример вывода:

-rwxrwx---+ 1 user1 208M 2018-07-16 ./filename.bak*
-rwxrwx---+ 1 user1  702 2018-07-15 ./filename.ldf*
-rwxrwx---+ 1 user1 208M 2018-07-15 ./filename.bak*

Самое замечательное в этом то, что после просмотра списка можно просто заменить часть списка командой findудаления:

find. -type f -mtime +270 -delete
0
27.01.2020, 19:37

Теги

Похожие вопросы