Во всем виноват джемаллок. Либо понизьте версию jemalloc:
pacman -U /var/cache/pacman/pkg/jemalloc-4.2.1-1-x86_64.pkg.tar.xz
, либо обновите систему с уже имеющимся в репозитории jemalloc 4.3.1-1
Если в именах ваших файлов нет символов новой строки в них вы могли бы сделать это, просто указав оболочке разделить вывод ls
только на новые строки, а не на пробелы по умолчанию. Разделение управляется переменной IFS
, любые символы, содержащиеся в IFS
, используются в качестве разделителей.
IFS=$'\n' # set it to just a newline
convert $(ls -vd ./*.png) output.pdf
Это может по-прежнему иметь проблемы, если имена файлов достаточно забавные или если ls
искажает их для отображения. При печати на терминал ls
обычно перечисляет файлы в нескольких столбцах. Но когда вывод не поступает на терминал (здесь его читает оболочка), он действует так, как если бы было задано -1
.
Для реализации идеи, с которой вы начали, вы можете использовать eval
.
eval: eval [arg ...]
Объедините ARG в одну строку, используйте результат в качестве входных данных для оболочки и выполните полученные команды.
Но проблема с eval
в том, что все и вся в командной строке снова анализируется, и даже то, что обычно безопасно, не является. Подумайте о файле с именем $ (touch HELLO)
и о том, что произойдет, если такое имя будет пропущено в командной строке.
Кроме того, если вы пойдете этим путем, вы можете использовать - quoting-style = shell
вместо -Q
, поскольку это может соответствовать обработке оболочкой специальных символов. ближе. (Оба могут быть специфичными для GNU ls, но я думаю, что -v
тоже.)
Если у вас последняя основанная на GNU система (чья sort
предоставляет аналогичную -V
natural-version) sort) вы можете отсортировать, используя это, и прочитать результат в массиве:
while read -rd '' f; do
files+=("$f")
done < <(find . -maxdepth 1 -name '*png' -print0 | sort -zV)
Затем вы сможете расширить массив в своей команде convert
:
convert "${files[@]}" out.pdf
В zsh
квалификатор glob (n)
дает вам порядок сортировки, аналогичный порядку сортировки GNU ls -v
:
convert ./*.png(n) out.pdf
В системе GNU с bash
, zsh
, yash
, mksh
или ksh93
:
eval "files=($(ls --quoting-style=shell-always -vd ./*.png))"
convert "${files[@]}" out.pdf
При использовании GNU Parallel это выглядит так:
ls -vd ./*png | parallel -Xj1 convert {} out.pdf