xargs com dois comandos - mkdir e sed

1

Eu quero criar catálogos e na mesma linha eu quero mudar o caminho e salvá-lo no arquivo de saída Eu não quero repetir o código, então eu tentei:

cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I %  bash -c 'mkdir -p %; sed 's/$/\/version/'% > output'

E eu tenho um erro:

sed: -e expression #1, char 6: unknown option to 's'

Você sabe o que estou fazendo de errado?

    
por diego9403 01.06.2016 / 19:51

1 resposta

1

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 e tr , 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("%s
cut -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 xargs (null).

-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% .
por 01.06.2016 / 23:34

Tags