Добавить текст в конец нескольких файлов в Linux
Мне нужно добавить следующий код в конец всем php файлам в каталоге и его подкаталоге:
</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>
Я пробовал с
echo "my text" >> *.php
Но терминал показал ошибку:
bash : *.php: ambiguous redirect
Что мне делать. есть сотни файлов, чтобы добавить этот сегмент кода, и было бы очень сложно добавить его в каждый файл. Спасибо заранее.
Ответы
Ответ 1
Вы не указываете оболочку, вы можете попробовать команду foreach
. Под tcsh (и я уверен, что очень похожая версия доступна для bash), вы можете сказать что-то вроде интерактивно:
foreach i (*.php)
foreach> echo "my text" >> $i
foreach> end
$i
будет принимать имя каждого файла каждый раз через цикл.
Как всегда, при выполнении операций с большим количеством файлов, вероятно, неплохо протестировать их в небольшом каталоге с образцами файлов, чтобы убедиться, что он работает так, как ожидалось.
К сожалению... bash
в сообщении об ошибке (я помечаю ваш вопрос). Эквивалентный цикл будет
for i in *.php
do
echo "my text" >> $i
done
Если вы хотите охватить несколько каталогов ниже того, где вы находитесь, вы можете указать
*/*.php
а не *.php
Ответ 2
Я обычно использую тройник, потому что думаю, что он выглядит немного чище, и он обычно подходит для одной линии.
echo "my text" | tee -a *.php
Ответ 3
BashFAQ/056 делает достойную работу, объясняя, почему то, что вы пробовали, не работает. Взгляни.
Поскольку вы используете bash (согласно вашей ошибке), команда for
- ваш друг.
for filename in *.php; do
echo "text" >> "$filename"
done
Если вы хотите вытащить "текст" из файла, вы можете сделать это:
for filename in *.php; do
cat /path/to/sourcefile >> "$filename"
done
Теперь... у вас могут быть файлы в подкаталогах. Если это так, вы можете использовать команду find
для их поиска и обработки:
find . -name "*.php" -type f -exec sh -c "cat /path/to/sourcefile >> {}" \;
Команда find
определяет, какие файлы используют такие условия, как -name
и -type
, тогда команда -exec
выполняет в основном то же самое, что я показал вам в предыдущем цикле "за". Окончательный \;
указывает на то, чтобы find
, что это конец аргументов -exec
вариант.
Вы можете man find
много подробностей об этом.
Команда find
переносима и обычно рекомендуется для такого рода действий, особенно если вы хотите, чтобы ваше решение было переносимым в другие системы. Но поскольку вы используете bash
, вы также можете обрабатывать подкаталоги с globstar
опции bash globstar
:
shopt -s globstar
for filename in **/*.php; do
cat /path/to/sourcefile >> "$filename"
done
Вы можете найти man bash
и поискать "globstar" для получения дополнительной информации об этом. Эта опция требует bash версии 4 или выше.
ПРИМЕЧАНИЕ. У вас могут быть другие проблемы с тем, что вы делаете. PHP-скрипты не должны заканчиваться символом ?>
, Поэтому вы можете добавлять HTML-код, который скрипт попытается интерпретировать как PHP-код.
Ответ 4
Вы можете использовать sed
в сочетании с find
. Предположим, что ваше дерево проекта
/MyProject/
/MyProject/Page1/file.php
/MyProject/Page2/file.php
etc.
Источник: http://www.grymoire.com/unix/Sed.html#uh-37
Ответ 5
Вы можете сделать (работайте, даже если в вашем пути к файлу есть место):
#!/bin/bash
# Create a tempory file named /tmp/end_of_my_php.txt
cat << EOF > /tmp/end_of_my_php.txt
</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>
EOF
find . -type f -name "*.php" | while read the_file
do
echo "Processing $the_file"
#cp "$the_file" "${the_file}.bak" # Uncomment if you want to save a backup of your file
cat /tmp/end_of_my_php.txt >> "$the_file"
done
echo
echo done
PS: вы должны запустить script из каталога, который вы хотите просмотреть