Как я могу сделать простой, find
который бы упорядочил результаты по самым последним модифицированным?
Вот текущий ток, который find
я использую (я делаю экранирование оболочки в PHP, так что это аргумент для переменных):
find '$dir' -name '$str'\* -print | head -10
Как я мог иметь этот порядок поиска по самым последним модифицированным? (Обратите внимание, я не хочу, чтобы он сортировал «после» поиска, а скорее находил результаты на основе того, что было недавно изменено.)
Ответы:
Использовать это:
printf
аргументы отman find
:%Tk
: Время последнего изменения файла в формате, указанномk
.@
: секунды с 1 января 1970 года, 00:00 по Гринвичу, с дробной частью.c
: дата и время локали (сб. 04 ноября 12:02:33 EST 1989).%p
: Имя файла.источник
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
он рекурсивно находит все файлы, содержащие шаблон первого аргумента, переданного команде (fr <pattern>
), и сортирует их по последнему последнему.find -L ...
ssed
чтобы избавиться от дробной части секунд, и все еще используйте ISO8601, как показало @PeterMortensen:find . -type f -printf "%TY-%Tm-%TdT%TT %p\n" | sort -r | ssed -R 's/^([^.]+)\.\d+ (.*)$/\1 \2/'
Самый простой способ - использовать zsh благодаря его квалификаторам glob .
Если у вас есть GNU find, заставьте его распечатать время изменения файла и отсортировать по нему.
Если у вас есть GNU find, но нет других утилит GNU, используйте символы новой строки вместо разделителей; вы потеряете поддержку имен файлов, содержащих переводы строк.
Если у вас есть Perl (здесь я предполагаю, что в именах файлов нет новых строк):
Если у вас есть Python (также предполагается, что в именах файлов нет перевода строки):
Вероятно, есть способ сделать то же самое в PHP, но я этого не знаю.
Если вы хотите работать только с инструментами POSIX, это довольно сложно; см. Как вывести список файлов, отсортированных по дате изменения рекурсивно (команда stat недоступна!) (повторная установка первых 10 - самая простая часть).
источник
find
версия показывает самые старые файлы, и вам нужно добавить эту-r
опциюsort
.Вам не нужен PHP или Python, просто ls :
Если команда * завершается со статусом ошибки (т. Е. Список аргументов слишком длинный ), вы можете выполнить итерацию с помощью команды find. Перефразировано из: Максимальная длина аргументов для нового процесса
find . -print0|xargs -0 command
(оптимизирует скорость, если find не реализует "-exec +", но знает "-print0")find . -print|xargs command
(если в аргументах нет пробелов)Если основная часть аргументов состоит из длинных, абсолютных или относительных путей, попробуйте переместить ваши действия в каталог.
cd /directory/with/long/path; command *
И еще одно быстрое решение может состоять в том, чтобы соответствовать меньшему количеству аргументов:command [a-e]*; command [f-m]*; ...
источник
Вам нужно только LS
Вы можете сделать,
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
как указано выше,или же
источник
xargs
звонитls
несколько раз, сортировка будет нарушена.+;
в конце? Кажется, что дает тот же результат без,;
однако он не работает без+
?Расширение ответа пользователя 195696 :
Для каждого файла сначала выводится числовая временная метка (для сортировки с последующим табулированием
\t
), затем удобочитаемая временная метка, затем размер файла (к сожалению,find
это-printf
невозможно в мегабайтах, только в кибибайтах), затем имя файла с относительным дорожка.Затем
sort -n
сортирует его по первому числовому полю.Затем
cut
избавляется от того первого числового поля, которое не представляет интереса для пользователя. (Печатает второе поле вперед.) Разделителем полей по умолчанию является\t
или табуляция.Пример вывода:
Я намеренно сделал поле размера файла 6 символов, потому что, если сделать его длиннее, становится трудно визуально различать, насколько большие файлы. Таким образом, файлы размером больше 1e6 КиБ выделяются: на 1 символ - 1-9 ГБ, на 2 символа - 10-99 ГБ и т. Д.
Изменить: вот еще одна версия (так как происходит
find . -printf "%Tc"
сбой на MinGW / MSYS):Давать вывод как:
Где:
-I{}
вызывает вхождение{}
аргумента в качестве аргумента, и теперь новые строки являются разделителями аргументов (обратите внимание на пробелы в именах файлов выше).ls -G
подавляет печать имени группы (пустая трата места).ls -h --si
производит удобочитаемые размеры файлов (более правильно с--si
).ls -t
сортирует по времени, что здесь не имеет значения, но это то, что я обычно использую.источник
T@
путьs
в любом из указанных выше команд.Вариант OS X ответа @ user195696:
С отметкой времени:
Без отметки времени:
источник
Я обнаружил, что это делает работу на Mac OS X (и достаточно общей, чтобы работать на других Unixen):
источник
Если ваш
find
выбор очень прост, вы можете обойтись без него и просто использоватьls
:источник
Пытаться:
Но также полезно фильтровать данные по
-mmin
/-mtime
и-type
.источник
Использование:
Эта команда отсортирует файлы по дате изменения.
И отображать как:
источник
У меня есть простое решение, которое работает как для FreeBSD (OS X), так и для Linux:
источник
Я не думаю, что
find
есть какие-либо варианты изменить порядок вывода.-mtime
и-mmin
позволит вам ограничить результаты файлами, которые были изменены в течение определенного промежутка времени, но выходные данные не будут отсортированы - вам придется делать это самостоятельно. В GNUfind
есть-printf
опция, которая, помимо прочего, позволит вам печатать время модификации каждого найденного файла (строки формата%t
или%Tk
); это может помочь вам отсортироватьfind
результаты так, как вы хотите.источник
Я улучшил ответ Akashs, сделав скрипт, корректно обрабатывающий пробелы в именах файлов:
источник
Если вы хотите заказать все файлы PNG по времени в
$PWD
:Этот простой однострочник дает всю гибкость регулярного выражения снова
find
и сноваls
.источник
Вы можете использовать
stat
в BSD и Linux (не в POSIX) следующим образом:Если вы хотите ограничить количество:
источник
Существует чистый и надежный способ
sort | head
по дате:Использование
ls -l
для красивой печатиВ качестве функции bash :
Это может быть выполнено с одним или двумя аргументами или даже без:
Образец:
Перечислите все не каталоги, отсортированные по дате. Nota:
Даже в большом дереве файловой системы, как и в случае
xargs
уже отсортированного списка, порядок файлов остается правильным, даже если егоls
нужно запускать много раз.Перечислите еще 12 последних не-каталогов, отсортированных по дате, с размером, напечатанным в удобочитаемой форме.
Перечислим еще 42 последние ссылки
Будут перечислены все символические ссылки, блочные устройства, сокеты и символы устройств, отсортированные по дате.
Инвертирующий порядок
Замена
head
наtail
и изменить переключательsort
иls
:Та же функция, то же использование:
источник
Если вы просто хотите получить полный путь к каждому элементу, вы можете записать его следующим образом.
Где
-printf "% T @% p \ n" для предоставления критериев сортировки (дата),
'sort -nr' для сортировки по дате,
head -10 для перечисления 10 лучших результатов,
cut -d '' -f 2 для вырезания ведущие отметки времени на каждой строке.
источник
cut -d ' ' -f 2
сломается, если имена файлов содержат пробелы.У меня есть простое решение.
После того,
cd
как в каталог, используйтеfind . -iname "*" -ls
источник