Как я могу сделать простое find
который заказал бы результаты последний раз измененным?
Вот ток find
Я использую (я делаю Escape оболочки в PHP, так, чтобы было обоснование для переменных):
find '$dir' -name '$str'\* -print | head -10
Как у меня мог быть этот порядок поиск последний раз измененным? (Обратите внимание, что я не хочу это к виду 'после' поиска, а скорее нахожу результаты на основе того, что было последний раз изменено.)
думаю, что в нет возможности изменить порядок вывода.
-mtime
и -mmin
позволят вам ограничить результаты только файлами, которые были изменены в течение определенного временного окна, но результат не будет отсортирован - вам придется сделать это самому. GNU find
имеет опцию -printf
, которая, помимо прочего, позволит вам распечатывать время модификации каждого найденного файла (строки форматирования %t
или %Tk
); это может помочь вам отсортировать вывод find
так, как вы хотите.
Самый простой метод - использовать 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 - это простая часть)
.Попробуйте:
find '$dir' -name '$str'\* -print | xargs ls -tl | head -10
Но также полезно фильтровать данные по -mmin
/-mtime
и -типу
.
Вам не нужен ни 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]*; ...