xargs: использование того же аргумента в нескольких командах

Крошечный сценарий добился бы цели. (протестированный с 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 на ОС и оболочке, которую Вы используете.

17
27.11.2012, 01:34
3 ответа

Это && не часть 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 замещающая строка.

23
27.01.2020, 19:47

Альтернативный, более читаемый способ - определить отдельную функцию, которая содержит все ваши другие команды, а затем вызвать эту функцию с помощью 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"'
3
27.01.2020, 19:47

Вы можете просто использовать упомянутую опцию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'

Успехов в написании сценариев!!! @энрике

0
07.03.2021, 20:15

Теги

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