Unix/Linux находит и вид по дате измененный

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

Вот ток find Я использую (я делаю Escape оболочки в PHP, так, чтобы было обоснование для переменных):

find '$dir' -name '$str'\* -print | head -10

Как у меня мог быть этот порядок поиск последний раз измененным? (Обратите внимание, что я не хочу это к виду 'после' поиска, а скорее нахожу результаты на основе того, что было последний раз изменено.)

141
задан 08.06.2012, 06:41

4 ответа

думаю, что в нет возможности изменить порядок вывода. -mtime и -mmin позволят вам ограничить результаты только файлами, которые были изменены в течение определенного временного окна, но результат не будет отсортирован - вам придется сделать это самому. GNU find имеет опцию -printf, которая, помимо прочего, позволит вам распечатывать время модификации каждого найденного файла (строки форматирования %t или %Tk); это может помочь вам отсортировать вывод find так, как вы хотите.

.
0
ответ дан 07.12.2019, 07:45

Самый простой метод - использовать zsh, благодаря его глобусным классификаторам.

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

Если у вас есть GNU find, заставьте ее напечатать время модификации файла и отсортировать по нему.

find -type f -printf '%T@ %p\0' |
sort -zk 1nr |
sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10

Если у вас есть GNU find, но не другие утилиты GNU, используйте новые строки в качестве разделителей вместо нулей; вы потеряете поддержку для имен файлов, содержащих новые строки.

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

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

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

Если у вас есть 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], reverse=True))[:10]: print f'

Возможно, есть способ сделать то же самое в PHP, но я этого не знаю.

Если вы хотите работать только с инструментами POSIX, это довольно сложно; смотрите Как рекурсивно перечислять файлы, отсортированные по дате модификации (нет команды stat!) (перечислять первые 10 - это простая часть)

.
84
ответ дан 07.12.2019, 07:45

Попробуйте:

find '$dir' -name '$str'\* -print | xargs ls -tl | head -10

Но также полезно фильтровать данные по -mmin/-mtime и -типу.

.
1
ответ дан 07.12.2019, 07:45

Вам не нужен ни PHP, ни Python, просто ls:

man ls:
-t     sort by modification time
-r,    reverse order while sorting (--reverse )
-1     list one file per line

find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;

Если команда * выходит со статусом сбоя (т.е. Список аргументов слишком длинный ), то вы можете выполнить итерацию с помощью find. Перефразируя из: Максимальная длина аргументов для нового процесса

  • find . -print0|xargs -0 команда (оптимизирует скорость, если find не реализует "-exec +", но знает "-print0")
  • find . -print|xargs команда (если в аргументах нет пробела)

Если основная часть аргументов состоит из длинного, абсолютного или относительного путей, то попробуйте перенести свои действия в каталог: cd /каталог/с/длинным/путем; команда * И еще одно быстрое исправление может заключаться в совпадении меньшего количества аргументов: команда [a-e]*; команда [f-m]*; ...

40
ответ дан 07.12.2019, 07:45

Теги

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