Вопрос по file, bash, unix – Добавить текст в конец нескольких файлов в Linux

24

Error: User Rate Limit Exceeded

</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>

Error: User Rate Limit Exceeded

echo "my text" >> *.php

Error: User Rate Limit Exceeded

bash : *.php: ambiguous redirect

Error: User Rate Limit Exceeded

Ваш Ответ

5   ответов
68

Я обычно использую тройник, потому что я думаю, что он выглядит немного чище и обычно умещается в одну строку.

echo "my text" | tee -a *.php
@pamphlet, согласился.
Такой отличный ответ.
Что делать, если мне нужно добавить строку для нескольких конкретных файлов. У меня есть несколько установок WordPress, и мне нужно добавить строку в конец каждого файла с именем functions.php. это было бы возможно с тройником?
Это дантистический ответ. :-) А так как OP использует bash, установка globstar также позволит ему обрабатывать PHP-файлы в подкаталогах.
12

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

Для цитаты из примера bash$i обрабатывать файлы с пробелами в них для
& Quot; найти & quot; Команда лучше для подкаталогов.
Как насчет файлов в подкаталогах? Я должен добавить к этому также. PS: я использовал командуfor i in $a do echo "the code" >> $i done Но во всех файлах он добавлялся дважды, и с файлами в подкаталогах ничего не происходило. Harikrishnan
1

#!/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: Вы должны запустить скрипт из каталога, который вы хотите просмотреть

полезно! Спасибо..
14

BashFAQ / 056 делает достойную работу, объясняя, почему то, что вы пытались, не работает. Посмотри.

Поскольку вы используете bash (в соответствии с вашей ошибкой),for команда твой друг.

for filename in *.php; do
  echo "text" >> "$filename"
done

Если вы хотите вытащить "текст" из файла вы можете вместо этого сделать это:

for filename in *.php; do
  cat /path/to/sourcefile >> "$filename"
done

Теперь ваша очередьmight есть файлы в подкаталогах. Если это так, вы можете использоватьfind Команда найти и обработать их:

find . -name "*.php" -type f -exec sh -c "cat /path/to/sourcefile >> {}" \;

find Команда определяет, какие файлы, используя условия, такие как-name а также-typeтогда-exec команда запускает в основном то же, что я показывал вам в предыдущем & quot; для & quot; петля. Финал\; указывает наfind что это конец аргументов-exec вариант.

Вы можетеman find для более подробной информации об этом.

find Команда переносима и обычно рекомендуется для этого вида деятельности, особенно если вы хотите, чтобы ваше решение было переносимым на другие системы. Но так как вы в настоящее время используетеbashВы также можете обрабатывать подкаталоги, используя bashglobstar опция:

shopt -s globstar
for filename in **/*.php; do
  cat /path/to/sourcefile >> "$filename"
done

Вы можетеman bash и найдите & quot; globstar & quot; для более подробной информации об этом. Эта опция требует bash версии 4 или выше.

NOTEУ вас могут быть другие проблемы с тем, что вы делаете. PHP-скрипты не имеютneed закончить?>, поэтому вы можете добавить HTML, который скрипт попытается интерпретировать как код PHP.

Команда find не работает. Harikrishnan
Что он сделал вместо того, чтобы работать?
Я обновил команду чем-то более гибким. Если вы покажете нам свойactual командная строка, мы можем быть в состоянии отладить.
Ничего не сделал Не вернул ошибку, но не добавил ни одной строки ни в один файл. Harikrishnan
3

Ты можешь использоватьsed  в сочетании сfind, Предположим, ваше дерево проекта

    /MyProject/ 
    /MyProject/Page1/file.php
    /MyProject/Page2/file.php
    etc.        
  1. Save the code you want to append on /MyProject/. Call it append.txt
  2. From /MyProject/ run:

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

    Explain:

    • find does as it is, it looks for all .php, including subdirectories
    • xargs will pass (i.e. run) sed for all .php that have just been found
    • sed will do the appending. '$r append.txt' means go to the end of the file ($) and write (paste) whatever is in append.txt ther,e. Don't forget -i otherwise it will just print out the appended file and not save it.

Источник:http://www.grymoire.com/unix/Sed.html#uh-37

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