Сортировка ls произведенный временем, когда существует слишком много файлов для единственного вызова

Возможно, следующий http://stevelosh.com/blog/2012/10/the-homely-mutt/#getting-email превосходно записанное сообщение от Steve Losh поможет Вам

5
11.08.2014, 10:15
3 ответа

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.

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

10
27.01.2020, 20:32

Вы можете использовать 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/,<> в своем коде.

3
27.01.2020, 20:32

В 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
3
27.01.2020, 20:32

Теги

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