Faça um loop em todos os arquivos e insira cabeçalhos de arquivos

Faça um loop em todos os arquivos e insira cabeçalhos de arquivos

Suponha que eu tenha este projeto fictício:

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

Quero inserir o cabeçalho do arquivo de direitos autorais em todos os arquivos *.sh, por exemplo, meu cabeçalho é:

/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */

Estou lutando, é multilinha, consegui escrever o script abaixo, mas não funciona para multilinha:

#!/bin/sh
HEADER=$(cat<<EOH
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
)

find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;

Responder1

Usa isto:

header='/*\n *  Copyright (c) 2015 by MyCompany, Inc.\n *  All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;

Notas:

  1. O shell substituirá o valor $headerdiretamente no comando sed. Isso permite a injeção de comandos arbitrários no script sed. Fazernãofaça isso a menos que você confie na fonte do arquivo header.

  2. O cabeçalho contém /caracteres. Esses caracteres devem ser escapados ou o comando substituto deve usar um delimitador diferente. Acima, |foi usado como delimitador.

  3. É uma prática recomendada usar letras minúsculas ou mistas para variáveis ​​de shell. O sistema usa letras maiúsculas para suas variáveis ​​e, embora não seja um problema neste caso, você não deseja sobrescrever uma acidentalmente.

Exemplo

Para ilustrar o comando sed revisado, considere este arquivo de teste:

$ cat file
1
2
3

O comando sed produz:

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

informação relacionada