Крошечный сценарий добился бы цели. (протестированный с ksh88 на Солярисе 10)
script.ksh
#!/bin/ksh
[[ $# != 1 ]] && exit 255 # test for nr of args
pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname
Затем можно работать find
выполнить сценарий:
find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;
Отметьте это оба script.ksh
и find
команда, которую я дал Вам, мог бы иметь различные синтаксисы depeding на ОС и оболочке, которую Вы используете.
Это &&
не часть xargs
команда, это - абсолютно отдельный вызов. Я думаю, что Вы захотите явно выполнить подоболочку:
echo 95 | xargs -n1 -I_percent -- sh -c '[ _percent -ge 95 ] && echo "No Space on disk _percent% full -- remove old backups please"'
Обратите внимание на то, что также я использую _percent
вместо {}
избегать дополнительных головных болей заключения в кавычки с оболочкой. Это не переменная оболочки; все еще просто xargs замещающая строка.
Альтернативный, более читаемый способ - определить отдельную функцию, которая содержит все ваши другие команды, а затем вызвать эту функцию с помощью xargs
во вспомогательной оболочке.
Отсюда, например:
myfunc(){
[ "$1" -ge 95 ] && echo "No Space on disk $1% full -- remove old backups please"
echo "Another command echoing $1"
}
export -f myfunc
echo 95 | xargs -n1 -I_percent -- sh -c 'myfunc "_percent"'
Вы можете просто использовать упомянутую опциюsh
и заключить команду в одинарные кавычки, как показано ниже, с дополнительной эквивалентной версиейif
:
#Your example
echo 95 | xargs -n1 -I{} sh -c '[ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"'
#if equivalent
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; fi'
Использование xargs
с псевдонимом в опции-I
для лучшей читабельности
echo 95 | xargs -n1 -IusedSpace sh -c 'if [ usedSpace -ge 95 ]; then echo "No Space on disk usedSpace% full -- remove old backups please"; fi'
С помощью if и соедините столько команд, сколько Вы хотите, разделив их точкой с запятой;нижепример с цепочкой из 2 и 4 команд
# 2 independent commands
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; echo "Value processed {}"; fi'
# 4 independent commands
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; echo "Space left on disk $( expr 100 - {})%"; echo "Space used {}%"; echo "Value processed {}"; fi'
Я добавил случай else
в ваш пример, он печатает левое место на диске
#If with else block
echo 80 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; else echo "Space left on disk $( expr 100 - {})%"; fi'
#Equivalent
echo 80 | xargs -n1 -I{} sh -c '[ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"; [ {} -ge 95 ] || echo "Space left on disk $( expr 100 - {})%"'
Другая модификация может заключаться в том, чтобы изолировать 95 процентов использования лимита в переменной, как показано ниже.:
echo 96 | xargs -n1 -IusedSpace sh -c 'usageLimit=95; if [ usedSpace -ge ${usageLimit} ]; then echo "No Space on disk usedSpace% full -- remove old backups please"; else echo "Space left on disk $( expr 100 - usedSpace)%"; fi'
Успехов в написании сценариев!!! @энрике