Перенаправление выхода подразделения в процесс

Вы также можете использовать оператор fx для фильтрации изображений по высоте/ширине, например,

identify -format '%[fx:(h>400 && w>400)]\n' image.png

выведет 1, если изображение больше 400x400 и 0, если оно равно или меньше 400x400...


Предполагая нормальные имена файлов (без новых строк/пробелов/табов и т.д.), вы можете использовать identify для печати имен изображений, которым предшествует либо 1:, либо 0: , обработать вывод, удалив строки, начинающиеся с 0: и удалив ведущие 1: в остальных строках, чтобы остались только имена файлов, по одному в строке, затем передать этот список в mogrify . .. @- (синтаксис @ был добавлен в imagemagick v6.5. 2):

identify -format '%[fx:(h>400 && w>400)]:%i\n' ./*.png | \
sed '/^1:/!d;//s///' | mogrify -resize '400x400' -- @-

Иначе, с помощью find вы можете вывести только файлы с размером > 400x400, а затем передать результат в xargs + mogrify (это менее эффективно, так как запускает оболочку для каждого файла, но должно работать со всеми типами имен файлов):

find . -maxdepth 1 -type f -name '*.png' -exec sh -c \
'identify -format "%[fx:(h>400 && w>400)]\n" "$0" | grep -q 1' {} \; -print0 \
| xargs -0 mogrify -resize '400x400'

Если вы являетесь пользователем zsh, смотрите также этот ответ.

2
10.07.2018, 15:55
2 ответа

Вам нужна подстановка процесса , например ssh... < <(...). ssh... < $(my_command)является подстановкой команды создает перенаправление с каждым словом из результата my_commandв качестве цели перенаправления.

3
27.01.2020, 22:09

Первый пример будет работать, если вы включите переменную LC_FOO, чтобы она находилась в списке AcceptEnvв файле /etc/ssh/sshd_configна стороне сервера.

$ grep AcceptEnv /etc/ssh/sshd_config
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
AcceptEnv LC_FOO

Теперь работает:

$ LC_FOO=x ssh -o SendEnv=LC_FOO root@host.mydom.com 'printenv LC_FOO'
x

Альтернативы

метод перенаправления

Я показал это в другом вопросе и ответе U&L под названием:Как я могу выполнить локальный скрипт на удаленной машине и включить аргументы? , а для вашего примера я бы рекомендовал сделать так:

$ ssh serverA "bash -s" -- <./ex.bash "arg1" "arg2"
метод heredoc

Вы также можете использовать стиль heredoc, который я выделил в других вопросах и ответах U&L под названием:Просмотр удаленного значения $PATH внутри сценария оболочки:

[root@skinner ~]# ssh mulder 'bash -s <<EOL
>   echo $HOSTNAME
>   hostname
> EOL'
mulder.bubba.net
mulder.bubba.net

Ссылки

1
27.01.2020, 22:09

Теги

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