Crie arquivos a partir do arquivo de texto e preencha-o com uma pequena cadeia de texto?

0

Estou no terminal do OS X e estou tentando fazer o seguinte:

Eu tenho um arquivo .txt com linhas de texto. Eu quero que cada linha se torne um arquivo.

Isso eu consegui fazendo: cat file.txt | xargs touch

Isso produz minha lista de arquivos, mas eu preciso que eles tenham algum tipo de conteúdo, não em branco.

Alguém pode me ajudar com um comando que produza os arquivos da lista com uma única linha de texto dentro de cada arquivo?

Assim como o comando echo 'Hello, world.' > foo.txt cria texto em foo.txt, mas com o meu cenário como descrito. É possível?

Obrigado antecipadamente!

/ Niklas

    
por lovefall 19.10.2017 / 23:09

1 resposta

1

1. Uma abordagem simples:

echo 'Hello, world.' > foo.txt
< file.txt xargs -L 1 cp foo.txt
rm foo.txt

O comando cat é muito usado em excesso; quando vir cat filename | command , você pode alterá-lo para command < filename ou equivalentemente, filename command . A opção -L 1 para xargs diz ler apenas uma linha de file.txt de cada vez; então, se file.txt contiver file1 e file2 (em linhas separadas), então xargs será executado

cp foo.txt file1
cp foo.txt file2

Eu presumo que o resto seja auto-explicativo. Se você quiser colocar tudo isso em uma linha, apenas junte as linhas com && :

echo 'Hello, world.' > foo.txt  &&  xargs -L 1 cp foo.txt < file.txt  &&  rm foo.txt

Mudei o < file.txt para o final do comando xargs , que é onde as pessoas costumam colocá-lo.

2. Mais flexível

Você provavelmente vai querer fazer algo mais complexo e sofisticado de escrever a mesma linha única para cada arquivo. Este comando:

xargs sh -c 'for f do echo "Hello, world." > "$f"; done' sh < file.txt

passa os nomes dos arquivos para uma invocação do shell ( sh ), que pode fazer qualquer coisa no arquivo nomeado (referenciado como "$f" ) que você poderia fazer a partir do prompt do shell. E, obviamente, com esse método, você não precisa criar e excluir um arquivo temporário.

3. Sem usar xargs

Você pode simplificar o acima para

while IFS= read -r f
do
    echo 'Hello, world.' > "$f"
done < file.txt

que é essencialmente o mesmo que a resposta anterior, exceto que desta vez o shell lê o arquivo file.txt , então você não precisa de xargs .

    
por 23.10.2017 / 09:23