Возможно, следующий http://stevelosh.com/blog/2012/10/the-homely-mutt/#getting-email превосходно записанное сообщение от Steve Losh поможет Вам
ls -t
самостоятельно выведет список всех файлов в текущем каталоге с такой сортировкой, без необходимости вообще перечислять их в командной строке.
Если вам нужно рекурсивное поведение find
или выполнить некоторые другие тесты с файлами, вы можете find
генерировать записи с отметками времени либо с помощью stat
] или с помощью GNU найдите параметр
-printf
и отсортируйте его. Примерно так:
find . -type f -printf '%T@ %p\0' | sort -zn
-printf '% T @% p \ 0'
генерирует пары отметок времени Unix, разделенных нулем (% T @
) - имя файла (% p
) . sort -z
также является нестандартным расширением GNU, которое использует записи, разделенные нулями, для обеспечения безопасности файлов. Параметр sort
также поддерживается в большинстве BSD, но -printf
, насколько мне известно, предназначен только для GNU.
Вы можете разрезать этот вывод обратно только на имена файлов или любой другой формат, который вам нравится.
Вы можете использовать find
с perl
Posixly:
$ find ! -name . -prune -print | perl -lne '
$h{$_} = -M;
END { print for sort {$h{$a} <=> $h{$b}} keys %h }
'
Это означает, что в имени файла нет символа новой строки.
Для работы с новой строкой можно:
$ find ! -name . -prune -exec printf "%s\0" {} + | perl -0lne ...
или использовать perl -le
, а затем разделить /\0/,<>
в своем коде.
В zsh:
print -rl -- *(om)
Квалификатор glob om
сортирует файлы по времени модификации (в обратном хронологическом порядке, т.е. сначала самые новые, например ls -t
). Используйте Om
, чтобы получить обратный порядок (хронологический порядок, например ls -tr
). Сделайте это * (Dom)
, чтобы включать файлы точек.
Конечно, вы можете изменить шаблон , например ** / * (Dom)
, чтобы рекурсивно переходить в подкаталоги. Если вы хотите использовать несколько шаблонов, заключите их в круглые скобки и используйте оператор |
для их разделения, например *. (Png | jpg) (om)
.
Поскольку print
является встроенной оболочкой, на эту команду не влияет ограничение максимальной длины командной строки. Если вы хотите вызвать внешнюю команду для действий с файлами в пакетном режиме и по порядку, вы столкнетесь с ограничением длины. Вы можете использовать printf '% s \ 0' * (om) | xargs -0 somecommand
для передачи файлов в xargs, если ваш xargs поддерживает ввод, разделенный нулем (Linux, * BSD), или собственный zsh zargs
:
autoload -U zargs
zargs -r -e '' -- *(om) '' somecommand
Для обработки одного файла за раз, используйте простой цикл, который можно сократить в zsh (в стиле csh):
for x (*(om)) somecommand