Intereting Posts
Что означает амперсанд в конце строки сценария оболочки? xsel </ tmp / xselection не работает в скрипте Как grep для чего-то, что находится в переменной среды и имеет косую черту? Bash: помогает оттачивать пользовательскую функцию Невозможно изменить раскладку клавиатуры при использовании приемника citrix на Fedora Влияют ли обновления dnf на обновления программного центра gnome? Как перечислить все имеющиеся в настоящее время комбинации комбинаций клавиш? Запуск двоичного файла, принадлежащего root без sudo Почему nmap закрыл мою связь? Как ограничить производительность процессора для KVM VM? Устройство / dev / mapper / mpathb1 исключено фильтром Найти и заменить содержимое файла pip не найдет системный пакет в настраиваемом месте Инициализация переменных Bash – требуется, рекомендуется или определяется по мере продвижения Почему мой журнал systemd не сохраняется при перезагрузках?

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

Я хочу присоединиться к pdf-файлам pdfjoin / pdfunite / … в числовом порядке, хорошо обсужденном в потоковом ответе. Linux-команда слияния PDF-файлов с численным сортированием и измененным временем. Если вы используете решение в потоке, он упорядочивает порядок в порядке и алфавитном порядке. Это проблематично с именами файлов, например, где вы видите, что обе имеют то же самое Модифицированное поминутная точность, но Visceral раньше второй точности (File Browser отмечает это и помещает Visceral сначала в Modified порядок.

 Filename Modified ----- --- 3.THE ABC.pdf 10:39 3.Visceral abc..pdf 10:39 

Полное имя файла

 1.Description abc.pdf 2.Gabcd.pdf 3.THE ABC.pdf 3.Visceral abc..pdf 4.description of abc.pdf 5.Chraa..pdf 

Предложение № 1 работает в цифровом и алфавитном порядке, но не в численном и модифицированном порядке

 # https://stackoverflow.com/a/23643544/54964 ls -v *.pdf | ... bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf' 

Предложение № 2 упрощенное дело, но не обрабатывает пробелы и другие специальные символы в именах файлов

 # https://stackoverflow.com/a/23643544/54964 pdfunite $(ls *.pdf | sort -n) output.pdf 

В pdfunite --help ничего не pdfunite --help о заказе, поэтому я думаю, что это должно быть сделано с помощью ls / sort / … У команды sort нет ничего о modified на своей странице руководства.

Проверка ответа xhienne

Порядок неправильный в выводе, где вы видите 2.jpg и 4.jpg по неправильной причине по какой-либо причине

 masi@masi:~/Documents$ ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s /home/masi/Documents/1.jpg /home/masi/Documents/3.jpg /home/masi/Documents/5.jpg /home/masi/Documents/6.jpg /home/masi/Documents/7.jpg /home/masi/Documents/8.jpg /home/masi/Documents/9.jpg /home/masi/Documents/10.jpg /home/masi/Documents/2.jpg /home/masi/Documents/4.jpg 

2-я итерация

 export LC_ALL=C; ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s 

Вывод

 /home/masi/Documents/1.jpg /home/masi/Documents/3.jpg /home/masi/Documents/5.jpg /home/masi/Documents/6.jpg /home/masi/Documents/7.jpg /home/masi/Documents/8.jpg /home/masi/Documents/9.jpg /home/masi/Documents/10.jpg /home/masi/Documents/2.jpg /home/masi/Documents/4.jpg 

ОС: Debian 8.5

Вы можете сделать это с помощью 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%%.*} Слева – с нулями (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) 
 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 изменит сортировку имени файла.

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

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

[Обновить]

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

 ls -tr [0-9]* | ( sort -t. -k1,1n -s; echo output.pdf ) | xargs pdfunite