Пакетное преобразование изображений с помощью xargs и преобразование, как назвать выходной файл?

Решение 1

Вы можете использовать systemd-ask-passwordдля назначения пароля переменной bash.

Пример

password=$(systemd-ask-password --echo "machinectl password: ")
machinectl login {{ user }} $password
machinectl shell {{ your command }}

Решение 2

Как пользователь root, вы можете использовать machinectl --no-ask-password. Из документации:

--no-ask-password

Do not query the user for authentication for privileged operations.

Ссылки

https://www.freedesktop.org/software/systemd/man/systemd-ask-password.htmlhttps://www.freedesktop.org/software/systemd/man/machinectl.html

1
01.11.2020, 01:07
2 ответа

Если вы можете заменить xargsна GNU parallel, этот действительно предоставляет строку замены {#}, содержащую выполняемый порядковый номер.

Так например дано

$ touch File{001..050}.jpg

, затем

$ printf '%s\0' *.jpg | parallel --null -n 5 echo convert {} -o output{#}.pdf
convert File001.jpg File002.jpg File003.jpg File004.jpg File005.jpg -o output1.pdf
convert File006.jpg File007.jpg File008.jpg File009.jpg File010.jpg -o output2.pdf
convert File011.jpg File012.jpg File013.jpg File014.jpg File015.jpg -o output3.pdf
convert File016.jpg File017.jpg File018.jpg File019.jpg File020.jpg -o output4.pdf
convert File021.jpg File022.jpg File023.jpg File024.jpg File025.jpg -o output5.pdf
convert File026.jpg File027.jpg File028.jpg File029.jpg File030.jpg -o output6.pdf
convert File031.jpg File032.jpg File033.jpg File034.jpg File035.jpg -o output7.pdf
convert File036.jpg File037.jpg File038.jpg File039.jpg File040.jpg -o output8.pdf
convert File041.jpg File042.jpg File043.jpg File044.jpg File045.jpg -o output9.pdf
convert File046.jpg File047.jpg File048.jpg File049.jpg File050.jpg -o output10.pdf
3
18.03.2021, 22:53

xargs не предоставляет способ подсчета текущего экземпляра. Вы можете выполнить ls *.jpg | xargs -d $'\n' -t -n 100 bash -c 'convert "$@" output-$$.pdf', чтобы получить разные имена, но тогда вам придется определять порядок на основе временной метки файла.

Решением было бы постепенное их объединение:

ls *.jpg  |  xargs -d $'\n' -t -n 100 bash -c 'convert "$@" temp.pdf'; if [ -f output.pdf ]; then mv temp.pdf next.pdf; pdftk output.pdf next.pdf cat output temp.pdf; fi; mv temp.pdf output.pdf`

Хотя я думаю, что лучшим способом для этого было бы просто конвертировать каждое изображение по отдельности:

find -name \*.jpg -exec convert \{\} \{\}.pdf \;
pdftk *.jpg.pdf cat output output.pdf

Это проще, и затраты на преобразование каждого изображения в отдельном процессе будут примерно эквивалентны одному экземпляру преобразования, обрабатывающему N из них.

Кроме того, если случается так, что одно из изображений на самом деле не упорядочено, его проще переупорядочить, чем заново преобразовывать каждое изображение, поскольку пакеты теперь изменились.

1
18.03.2021, 22:53

Теги

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