Escreva o texto nas primeiras linhas de cada arquivo

1

Eu quero que meu aplicativo da web seja software livre, com uma licença GNU. Eu li que deveria adicionar meu nome e a licença em todos os arquivos. Eu tenho um monte de arquivos, então eu acho que eu poderia executar um comando para escrever essas linhas para todos os arquivos. Eu estive procurando e encontrei o comando sed para inserir texto. Então eu faria:

sed -i '1 i\/* Copyright 2013 Manolo Salsas  \nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA*/ ' ./*

mas este comando não é recursivo, então devo fazer:

find ./* -type f | xargs sed -i '1 i\/* Copyright 2013 Manolo Salsas  \nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA*/ '

Ele deve inserir essas linhas nas primeiras linhas de cada arquivo (espere as ocultas que começam com um ponto), mas não está funcionando.

O que eu poderia estar fazendo de errado?

Devo adicionar realmente essas linhas a CADA arquivo?

    
por Manolo 08.11.2013 / 13:46

1 resposta

4

Sua solução funciona (copiada e colada no meu shell), exceto que ela também toca em dotfiles em subdiretórios. Para evitar tocar neles, você precisa invocar find as

find -type f \! -name '.*' | xargs sed -i '1 i\/* ... */'

( -and é assumido entre -type f e \! -name '.*' ). Note que eu preciso escapar ! no meu shell (Bash).

Observe que a opção insert de sed não funciona se os arquivos estiverem em branco. Se você escrever algum texto nos arquivos da pasta atual, ele funciona.

Além dos arquivos de configuração, você deve evitar gravar em imagens. Meu palpite é que seria melhor especificar os formatos a serem gravados. Algo parecido com isto:

find ./* -regex ".*\.\(php\|js\|txt\|html\|css\|yml\|twig\)" -type f | xargs sed -i '1 i\/* CCCopyright 2013 Manolo Salsas  [B\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA*/ '

Atualização:

Outra solução para filtrar arquivos com base em tipos de arquivos é usar o recurso de seleção de tipo de arquivo ack . Supondo, por exemplo, que você queira selecionar apenas arquivos C e Perl:

ack -f --type=cc --type=perl | xargs sed -i '1 i\/* ... */'

( type=cc significa C)

    
por 08.11.2013 / 14:53