Executing Command in Pipes

0

Eu preciso entender por que não consigo executar o seguinte.

ls -d /data/VT60000* | xargs -IDIRECTORY find DIRECTORY -type f -iname RJ\*.xml | xargs -IFILE sh -c ' XML=$( xmlstarlet fo -D "FILE" );
EXTRACT=$( xmlstarlet sel -t -c "concat('JD',/root/item1,/root/item2)" <<< "$XML" );
echo '$EXTRACT'; '

Eu tenho um monte de pastas que contém milhares de arquivos XML. Eu gostaria de extrair informações desses arquivos e manipulá-los para processamento posterior. A razão pela qual eu estou canalizando é porque eu gostaria de executar vários processos (-P)

O segundo xmlstarlet falha na execução e não consigo entender o porquê.

A questão é como posso conseguir isso? Para obter um valor em $ EXTRACT.

Obrigado pela assistência antecipada.

    
por Noel Alex Makumuli 20.01.2018 / 18:57

2 respostas

1

A questão principal aqui parece ser que você está atribuindo a variável XML dentro de um shell chamado de xargs , mas você tenta usar a variável do script principal. Isso não funcionará, já que não há como o subprocesso passar a variável diretamente para o shell pai.

Em vez disso, você precisará imprimir o valor ou usá-lo no mesmo shell.

Do script, parece-me que o que você quer fazer é isto:

xmlstarlet fo -D "FILE" | xmlstarlet sel -t -c "concat('JD',/root/item1,/root/item2)"

ou com o sh -c

sh -c 'xmlstarlet fo -D "FILE" | xmlstarlet sel -t -c "concat('\''JD'\'',/root/item1,/root/item2)"'

Embora a citação fique horrível, pode valer a pena colocar isso dentro de outro script, ou em uma variável (seja apenas a string ou a coisa toda em uma matriz).

Além disso, não tenho certeza do que você quer fazer com a saída do xmlstarlet na primeira linha, se ela for chamada várias vezes.

Em vez de ls /data/VT60000* | xargs , você pode usar printf "%s%code%" * | xargs -0 para evitar problemas com nomes de arquivos problemáticos.

    
por 20.01.2018 / 19:50
0

echo '$EXTRACT' não funciona devido ao uso incorreto de aspas simples (aspas simples não permitem substituições) e aspas simples aninhadas incorretas (aspas simples entre aspas simples). Deve ser aspas duplas entre aspas simples. Não posso testar seus códigos, então escrevi isso e testei:

ls -d $HOME | \
   xargs -IDIR find "DIR" -type f -name '*\.conf' | \
   xargs -IFILE sh -c 'l=$(wc -l "FILE"); echo "$l"'
    
por 21.01.2018 / 05:59