Подтвердить что ты не робот

Добавить текст в конец нескольких файлов в 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

Что мне делать. есть сотни файлов, чтобы добавить этот сегмент кода, и было бы очень сложно добавить его в каждый файл. Спасибо заранее.

4b9b3361

Ответ 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.        
  • Сохраните код, который вы хотите добавить на /MyProject/. Назовите его append.txt
  • От /MyProject/ run:

    find . -name "*.php" -print | xargs sed -i '$r append.txt'
    

    Объясняю:

    • find делает это как есть, он ищет все .php, включая подкаталоги
    • xargs пройдет (т.е. запустите) sed для всех .php, которые только что были найдены
    • sed выполнит добавление. '$ r append.txt' означает перейти к концу файла ($) и записать (вставить) все, что есть в append.txt. Не забывайте -i, иначе он просто распечатает прилагаемый файл и не сохранит его.

Источник: 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 из каталога, который вы хотите просмотреть