Xargs com várias substituições de argumentos - Use argumento de variável de ambiente após sh -c '…'

2

Este é o meu comando:

find $1 -name "*.html"  | sort -n | xargs -I {} sh -c 'echo "Dumping file: "{} >> "$2"; w3m {} >> "$2" 2>&1'

onde:

$ 1 é o caminho onde procurarei arquivos com a extensão .html

$ 2 é o arquivo onde eu quero registrar as informações (Dumping do arquivo: * html e as informações contidas neste arquivo html)

O problema é que $ 2 não é interpretado. Pode ser porque esta variável está entre '...' Eu tentei com aspas duplas, mas o comando não está funcionando.

Alguém sabe como passar as informações de $ 2 na minha linha de comando?

    
por Victor Doors 24.07.2017 / 16:26

3 respostas

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"

Mais uma otimização pode ser:

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"

como os comandos echo e w3m estão fazendo as mesmas coisas com os descritores de arquivo 1 e 2, é melhor fazer isso em um lugar no começo.

Você também pode evitar a execução de um sh por arquivo com:

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"
    
por 24.07.2017 / 16:41
0

Basta removê-los das citações simples:

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

A casca colará tudo junto.

    
por 24.07.2017 / 16:31
0

Algumas maneiras de contornar a citação seria passar as variáveis para os argumentos internos sh as:

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

ou apenas export das variáveis relevantes para que você as chame pelo nome

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

Embora note que find e xargs -L podem funcionar mal se você tiver nomes estranhos de arquivos: newlines, obviamente, e -L trata especialmente os espaços em branco.

    
por 24.07.2017 / 16:58