xargs e tubo linha por linha

3

Eu tenho 3 arquivos: a.txt , b.txt e c.txt . Eu quero criar 3 arquivos: a.test , b.test e c.test contendo o texto simples "abracadabra". Basicamente, o objetivo é criar os arquivos .test para cada arquivo .txt e conter algum texto. Eu estou tentando usar xargs para fazer isso.

anlx2626> ls
a.txt  b.txt  c.txt

anlx2626> ls *.txt | awk -F'.txt' '{print $1}' | xargs -I {} echo "abracadabra" > {}.test

anlx2626> ls *.test
ls: No match.

Alguém poderia indicar por que usar o espaço reservado {} para tubo de linha por linha não funciona da maneira que eu esperava?

    
por Sharath Raju 02.12.2015 / 17:49

3 respostas

1

awk pode produzir texto, não é necessário echo ou xargs . Sua abordagem tem problemas para nomes de arquivos com mais de um ponto, como foo-1.2.txt .

Também teria problemas para nomes de arquivos com novas linhas ou se houver diretórios cujo nome terminasse em .txt .

Por uma vez, eu usaria um loop aqui, por exemplo, com zsh:

(set -o noclobber; for f (*.txt(N)) echo abracadabra > $f:r.test)

Ou POSIXly:

(set -o noclobber
 for f in *.txt; do
   echo abracadabra > "${f%.*}.test"
 done)

O noclobber é para evitar a substituição de um arquivo já existente. Note que omite arquivos ocultos. Se não houver nenhum arquivo txt , ele criará um arquivo *.test .

    
por 02.12.2015 / 18:10
1

Neste código:

xargs -I {} echo "abracadabra" > {}.test

xargs não verá o operador de redirecionamento > : será interpretado pelo seu shell, criando um arquivo chamado literalmente {}.test .

Uma maneira de fazer o que você pede usando xargs é isso, o que permite interpretar o operador de redirecionamento:

xargs sh -c 'for i do echo abracadrabra > "$i"; done' sh

Mas provavelmente seria melhor não usar xargs, que outros respostas explicam como fazer.

    
por 02.12.2015 / 17:59
-2
for l in $(ls *.txt); do echo "abrakadabra" > $l; done
    
por 22.10.2018 / 20:22

Tags