Xargs с множественными заменами аргументов - использовать аргумент переменной среды после sh -c '…'

В оболочках POSIX значение специальной встроенной переменной $ # соответствует количеству установленных позиционных параметров. Пример: [

] Установите $ 1 , $ 2 и $ 3 и установите для « $ # » значение 3:

set c a b

От Базовые спецификации Open Group, выпуск 6

2
24.07.2017, 17:35
3 ответа
find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
   echo "Dumping file: $2" >> "$1"; w3m "$2" >> "$1" 2>&1
' sh "$2"

Еще одна оптимизация может быть:

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
   exec 1>> "$1" 2>&1
   echo "Dumping file: $2"
   w3m "$2"
' sh "$2"

, так как обе команды echoи w3mделают одно и то же со своими файловыми дескрипторами 1 и 2, поэтому лучше сделать это вначале в одном месте.

Вы также можете избежать запуска одного shдля каждого файла с помощью:

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 sh -c '
   out=$1; shift
   for file do
     echo "Dumping file: $file"
     w3m "$file"
   done >> "$out" 2>&1
' sh "$2"
3
27.01.2020, 22:03

Просто удалите их из одинарных кавычек:

... sh -c 'echo "Dumping file: "{} >> '"$2"'; w3m {} >> '"$2"' 2>&1'

Оболочка склеит все воедино.

0
27.01.2020, 22:03

Некоторые способы обхода цитирования заключаются в передаче переменных во внутреннюю shв качестве аргументов:

log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$2"; w3m {} >> "$2" 2>&1' sh {} "$log"

или просто exportсоответствующие переменные, чтобы вы обращались к ним по имени

export log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$log"; w3m {} >> "$log" 2>&1' sh {} 

Хотя обратите внимание, что простые findи xargs -Lмогут работать плохо, если у вас странные имена файлов :новые строки, очевидно, и -Lспециально обрабатывает конечные пробелы.

0
27.01.2020, 22:03

Теги

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