Как отсортировать имена файлов в числовом порядке И измененном временном порядке?

| - оператор конвейера в Unix / Linux. Его можно использовать там, где выходные данные первой команды могут использоваться в качестве входных данных для второй команды.

Например:

ls -l | less покажет длинный список ваших файлов в каталоге. Команда less принимает выходные данные ls -l в качестве входных данных и отображает список файлов, в которых вы прокручиваете вверх / вниз и видите их.

4
23.05.2017, 15:40
3 ответа

Вы можете сделать это с помощью zsh :

zmodload zsh/stat

prefixmtime () {
sortstring=${(l:6::0:)${REPLY%%.*}}$(zstat -F '%s' +mtime -- $REPLY)
REPLY=${sortstring}
}

print -rl -- *(o+prefixmtime)

Замените print -rl своей командой, если вы ' я доволен результатом


Как это работает:
Здесь глобусы будут отсортированы (с помощью o + function ) в зависимости от того, что возвращает функция prefixmtime , то есть sortstring , которая представляет собой строку, полученную путем объединения числового префикса каждого имени файла $ {REPLY %%. *} left- , дополненного нулями (l: 6 :: 0:) (при условии, что префиксы имеют длину до 6 символов) и mtime в секундах (получено с помощью zstat ​​модуль). Может быть, будет легче понять, как это работает, если вы запустите:

{ for f (*)
printf '%s %s\n' ${(l:6::0:)${f%%.*}}$(zstat -F '%s' +mtime -- $f) $f
} | sort -k1,1n

Обратите внимание, что вышеупомянутое предполагает, что вы находитесь в том же каталоге, что и ваши файлы, в противном случае вам придется определить строку сортировки в этой функции как

sortstring=${(l:6::0:)${${REPLY##*/}%%.*}}$(zstat -F '%s' +mtime -- $REPLY)

и тогда вы можете использовать пути к каталогам, например

print -rl some/place/else/*(o+prefixmtime)
5
27.01.2020, 20:47

Решение состоит в том, чтобы сначала отсортировать по времени модификации, затем отсортировать только по первому числовому полю (при условии, что поля разделены '.'), отключив при этом сравнение в последнюю очередь (оно же стабильная сортировка).

ls -tr [0-9]* | sort -t. -k1,1n -s

[update]

Поскольку у вас в именах файлов есть пробелы, вы должны использовать xargs для выполнения pdfunite:

ls -tr [0-9]* | ( sort -t. -k1,1n -s; echo output.pdf ) | xargs pdfunite
2
27.01.2020, 20:47
find /home/masi/Documents -maxdepth 1 -type f -name '[0-9]*' -printf "%T+ %f\n" | sort -k2n -k1,1| cut -d ' ' -f 2- | xargs -i echo pdfunite /home/masi/Documents/{} output.pdf

Это не будет обрабатывать новые строки в именах файлов.

Вы можете переключить реверсирование порядка сортировки, изменив -k1,1 на -k1,1r , что изменит сортировку по времени, а -k2nr изменит обратное сортировка имени файла.

4
27.01.2020, 20:47

Теги

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