O erro foi gerado porque você está usando muitos '
. Em particular, s/$/\/version/
está fora de qualquer citação única.
sed
está trabalhando em um arquivo na entrada padrão. Não é possível alterar uma string passada como parâmetro. O comando interno printf
pode ser usado para anexar /version
.
Observações:
- há um nome extraído para cada linha lida do arquivo
tmp1
, portanto, os nomes não contêm\n
. - de acordo com o uso de
cut
etr
, os diretórios resultantes não conterão.
nor;
char em seus nomes.
O que você está tentando alcançar é isso:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
Observe que caracteres especiais em nomes quebrarão a linha de comando acima: por exemplo, '
(aspas simples).
cut
e tr
podem ser substituídos por apenas um awk
, que com xargs -0
pode ser usado para manipular com segurança os nomes (separados com caractere nulo).
Experimente esta versão segura:
awk -F\; '{gsub(/[.]/,"/",$1);printf("%scut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
",$1)}' tmp1 | xargs -0 bash -c 'for f; do mkdir -p "${f}";printf "%s/version\n" "${f}";done' arg0dummy > output
awk
script:
-
-F\;
define;
como separador de campo, então$1
é o primeiro campo (antes de;
) -
gsub
é usado para substituir.
por/
-
printf
é usado para imprimir o resultado e inserir um caractere final
(null).xargs
-0
:
-
bash -c ...
: Itens de entrada são terminados por um caractere nulo em vez de por espaços em branco, e as aspas e barra invertida não são especiais (cada caractere é interpretado literalmente). Desativa o final de string de arquivo, que é tratada como qualquer outro argumento. Útil quando os itens de entrada podem contém espaços em branco, marcas de cotação ou barras invertidas.
arg0dummy
:
-
man bash
: não é usado, mas é obrigatório; veja %code% .