как сделать скрипт BASH, чтобы найти все файлы php.ini в дереве каталогов и добавить к ним текст

Моя хостинговая компания объявляет о максимальном размере загрузки php, который может достигать 60M, но по умолчанию он равен 2M, и я не могу внести изменения в файл htaccess. Я могу переопределить настройки по умолчанию, изменив файлы php.ini, но это необходимо сделать для каждого файла php.ini в дереве каталогов. То, что мне и многим пользователям нужно и нужно просить, - это скрипт BASH, который выполнит следующую задачу:

  1. рекурсивно находит файлы php.ini
  2. сканирует файл на наличие две строки текста (новые директивы php)
  3. , если у него нет этих двух строк текста, добавьте две строки текста. Сохраните файл и перейдите к следующему файлу.
  4. Если у него есть эти две строки текста, ничего не делайте и переходите к следующему файлу.

Я понял, как найти. -файл php.ini и добавьте (не правильно) две строки, которые нужно добавить.

Даже при этом, если я пойму, как правильно добавить строки, если запустить снова, они добавят строки снова. Не только к новым файлам, которые нужно исправить.

Если бы кто-нибудь мог помочь мне с частью

find . -ifile php.ini -exec ?????? '{}' \;

, я бы сам смог понять, как сделать все остальное.

4
задан 2 September 2015 в 13:00

1 ответ

Я выбрал бы этот подход:

#!/bin/bash
path='/path'
line1='foo'
line2='bar'
while read f; do
    if [ ! "$(grep "$line1" "$f")" ] && [ ! "$(grep "$line2" "$f")" ]; then
        echo "$line1" >> "$f"
        echo "$line2" >> "$f"
    fi
done < <(find "$path" -type f -name 'php.ini')

Некоторые примечания:

  • $path объявляется / инициализированным внутренне, но это может быть передано как аргумент сценарию с очень немногими / мало модификаций если более удобный;
  • find "$path" -type f -name 'php.ini' выполняется во внешней оболочке, и ее вывод перенаправляется к while цикл с помощью замены процесса, потому что, передавая ее вывод по каналу непосредственно к while цикл уехал бы $line1 и $line2 из while объем цикла;
  • -type f в find "$path" -type f -name 'php.ini' могло бы быть избыточным, но только быть безопасным;
  • Два echo команды, возможно, были объединены в сингл echo команда, но это потребовало бы для добавления -e опция выйти \n последовательность; не зная, что точные строки добавляются (который мог бы содержать другие escape-последовательности), не используя -e опция и использование два echo команды более безопасны;

Поиски сценария, рекурсивно, для любого файла называют php.ini в $path путь; для каждого файла, если оба grep команды в if оператор не возвращается 0 (т.е. если ни один строка, содержащая / соответствие $line1 строка, ни строка, содержащая / соответствие $line2 строка найдена в файле), $line1 и $line2 добавляются в конце файла.

Демонстрационный вывод на тестовой иерархии:

user@debian ~/tmp % tree -a
.
├── 1
│  ├── 2
│  │  ├── 3
│  │  │  ├── file
│  │  │  └── php.ini
│  │  ├── file
│  │  └── php.ini
│  ├── file
│  └── php.ini
└── script.sh

3 directories, 7 files
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:

foo
bar
another line

1/file:

foo
bar
another line

1/2/3/php.ini:

foo
bar
another line

1/2/3/file:

foo
bar
another line

1/2/php.ini:

just one line

1/2/file:

foo
bar
another line

user@debian ~/tmp % bash script.sh                 
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:

foo
bar
another line

1/file:

foo
bar
another line

1/2/3/php.ini:

foo
bar
another line

1/2/3/file:

foo
bar
another line

1/2/php.ini:

just one line
foo
bar

1/2/file:

foo
bar
another line
2
ответ дан 2 September 2015 в 23:00
  • 1
    Просто для уточнения, что делает " - parents"? И спасибо за оба из Ваших ответов. – Peacemaker5 23 November 2016 в 08:57

Другие вопросы по тегам:

Похожие вопросы: