1

Я хочу, чтобы мое веб-приложение было свободным программным обеспечением с лицензией GNU. Я прочитал, что я должен добавить свое имя и лицензию в каждом файле. У меня много файлов, поэтому я думаю, что смогу выполнить команду для записи этих строк во все файлы. Я искал вокруг и нашел команду sed для вставки текста. Так что я бы сделал:

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*/ ' ./*

но эта команда не является рекурсивной, поэтому я должен сделать:

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*/ '

Он должен вставлять эти строки в первые строки каждого файла (кроме скрытых, начинающихся с точки), но он не работает.

Что я могу делать не так?

Должен ли я действительно добавить эти строки в КАЖДЫЙ файл?

1 ответ1

4

Ваше решение работает (копируется и вставляется в мою оболочку), за исключением того, что оно также касается файлов точек в подкаталогах. Чтобы не трогать их, вам нужно вызвать find как

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

(-and предполагается между -type f и \! -name '.*'). Обратите внимание, что мне нужно сбежать ! в моей раковине (Баш).

Обратите внимание, что опция insert sed не работает, если файлы пустые. Если вы напишите какой-нибудь текст в файлы текущей папки, это сработает.

Помимо файлов конфигурации, вам следует избегать записи в изображения. Я предполагаю, что было бы лучше указать форматы для записи. Что-то вроде этого:

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*/ '

Обновить:

Другое решение для фильтрации файлов по типам файлов - использовать функцию выбора типа файлов в ack . Предполагая, например, что вы хотите выбрать только файлы C и Perl:

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

(type=cc означает C)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .