Passa o arquivo de entrada pelo pipe como argumento?

2

Eu tenho dois problemas. Eu estou tentando passar arquivos através de um pipe como um argumento e estou tentando usar esse arquivo como uma variável dentro da função sh .

Aqui está o meu comando:

find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

Aqui, minha linha é encontrar todos os arquivos que parecem " segment.something " e passar para o lado direito do canal. Em someFunction.sh , preciso do nome do arquivo como um argumento. Digamos que o arquivo que está sendo inserido em segment1 .

O someFunction.sh imprimirá todas as linhas de segment1 (por exemplo).

Como faço para passar a saída do lado esquerdo do tubo para o lado direito e, em seguida, como posso chamá-lo dentro de someFunction.sh ?

    
por Akshay 24.06.2016 / 22:39

2 respostas

3

Seu comando

$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

tem o efeito de que, no máximo, quatro cópias do script de shell someFunction.sh serão iniciadas ( -P 4 ) em paralelo (novas serão geradas assim que as antigas forem concluídas), cada uma obtendo um nome de arquivo como seu argumento ( -n 1 ).

Isso significa que cada chamada do seu script será parecida com

sh someFunction.sh segmentsomething

Dentro do script, o shell colocará os valores dos parâmetros posicionais (os argumentos na linha de comando) em $1 , $2 etc. ( $0 geralmente contém o nome do próprio script). No seu caso, $1 conterá o nome do arquivo e os outros estarão vazios.

Então, no script:

filename="$1"

echo "$filename"
cat "$filename"

É isso. Agora, geralmente quando alguém usa find para procurar por arquivos e passar seus nomes de arquivos para xargs , há o problema com nomes de arquivos que as pessoas tendem a lembrar uns dos outros, e eu farei isso aqui também.

O utilitário find passa nomes de arquivos separados por espaço em branco. Isso não é bom se você tiver nomes de arquivos com espaços, pois isso causaria problemas para xargs invocar seu script com nomes próprios.

Portanto, é uma boa prática sempre usar -print0 com find e -0 com xargs , o que significa que os nomes dos arquivos, em vez de separados por espaços, são separados por nul caracteres ( %code% ). Isso torna muito mais seguro.

Assim:

$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh
    
por 24.06.2016 / 23:10
2

Você poderia usar algo assim assumindo someFunction.sh em seu diretório de trabalho.

find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh 

O -print0 e -0 permitem arquivos com espaços no nome (um problema comum).     No meu someFunction.sh tenho

#!/bin/bash
echo "Arg: " $1  
cat $1

Que simplesmente ecoa o nome do arquivo e grava o conteúdo do arquivo passado para someFunction.sh

    
por 24.06.2016 / 22:49