проблема с цитированием вывода ls

Во всем виноват джемаллок. Либо понизьте версию jemalloc:

pacman -U /var/cache/pacman/pkg/jemalloc-4.2.1-1-x86_64.pkg.tar.xz

, либо обновите систему с уже имеющимся в репозитории jemalloc 4.3.1-1

https://archive.archlinux.org/packages/j/jemalloc/

2
23.09.2016, 01:51
4 ответа

Если в именах ваших файлов нет символов новой строки в них вы могли бы сделать это, просто указав оболочке разделить вывод 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 тоже.)

1
27.01.2020, 21:59

Если у вас последняя основанная на 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
2
27.01.2020, 21:59

В 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
1
27.01.2020, 21:59

При использовании GNU Parallel это выглядит так:

ls -vd ./*png | parallel -Xj1 convert {} out.pdf
0
27.01.2020, 21:59

Теги

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