Eu quero fazer algumas árvores de diretórios e preencher cada extremidade da árvore com um arquivo de texto com conteúdo aleatório.
Aqui está o que eu tentei até agora:
#!/bin/bash
set -e
echo "Generating test folders"
mkdir -p ./parent_{0..9}/child_{0..9}
head -c 100 /dev/urandom | xargs echo >> ./parent_{0..9}/child_{0..9}/test.txt
echo "done"
Ao executar, recebo este erro:
./gen-test.sh: line 8: ./parent_{0..9}/child_{0..9}/test.txt: ambiguous redirect
O que estou fazendo de errado e qual poderia ser uma abordagem mais inteligente para essa tarefa?
A razão pela qual o que você está fazendo de errado não funciona é porque o redirecionamento e a geração de nome de arquivo são manipulados pelo shell, não por xargs.
Quando você escreve
então o shell será executado
foo
para você, capturará sua saída padrão e gravará isso emfoo.out
.Se você correr
então o shell será executado
foo
para você, capturará sua saída padrão, executaráxargs
e enviará a saída padrãofoo
para a entrada padrão dexargs
. Em algum momento,xargs
executarábar
, e passará os dados recebidos na entrada padrão como argumentos, e fará isso de uma maneira que faça com que a saída padrão debar
seja indistinguível da saída padrão dexargs
. O shell capturará essa saída padrão e a gravará embar.out
.Seus argumentos de
./parent_{0..9}/child_{0..9}/test.txt
também são interpretados pelo shell. Ele remove esse argumento e o substitui pelos nomes de arquivo que seriam gerados por esse padrão, de modo que amkdir
linha de comando se torne algo como (...
adicionado por brevidade):Mais tarde, você corre
o que significa que você lê 100 bytes de dados aleatórios, transforma isso em argumentos de linha de comando
echo
por meio dexargs
, que tentará gerar esses dados (o que é improvável que funcione bem, já que são dados binários e estamos falando sobre uma linha de comando aqui).Finalmente, o shell vê
>>
, que o interpreta como um redirecionamento de acréscimo, seguido pelo mesmo padrão; então isso significa que o redirecionamento se tornamas você não pode fazer isso; você só pode redirecionar para um arquivo por vez (este é o erro de "redirecionamento ambíguo" que você vê).
A solução mais fácil é fazer um loop sobre os arquivos:
porque qualquer solução que use xargs exigirá echo para transformar argumentos de linha de comando em saída padrão, apenas para usar xargs para transformar a mesma saída padrão novamente em argumentos de linha de comando, o que é obviamente ineficiente.