Adăugați un text la sfârșitul mai multor fișiere din Linux

Trebuie să atașez la sfârșit sfârșitul următorului cod la toate fișierele PHP dintr-un director și sub directorul său:

</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">

</div>

I have tried with

echo "my text" >> *.php

But terminal showed the error:

bash : *.php: ambiguous redirect

What should I do. there are hundreds of files to add this code segment and it would be a real tough time adding it in each file. Thanks in advance.

0

5 răspunsuri

Nu specificați shell-ul, puteți încerca comanda foreach . Sub tcsh (și sunt sigur că o versiune foarte asemănătoare este disponibilă pentru bash), puteți spune ceva interactiv:

foreach i (*.php)
foreach> echo "my text" >> $i
foreach> end

$i will take on the name of each file each time through the loop.

Ca întotdeauna, atunci când faci operații pe un număr mare de fișiere, este probabil o idee bună să le testezi într-un director mic cu fișiere sample pentru a te asigura că funcționează așa cum era de așteptat.

Oops .. bash în mesaj de eroare (îți voi eticheta întrebarea). Buclele echivalente ar fi

for i in *.php
do 
   echo "my text" >> $i
done

Dacă doriți să acoperiți mai multe directoare mai mici decât cele pe care le puteți specifica

*/*.php

rather than *.php

0
adăugat
Cum rămâne cu fișierele din subdirectoarele? Trebuie să adaug și asta. PS: Am folosit comanda pentru i în $ a echo "codul" >> $ i done Dar în toate fișierele a fost atașat de două ori și nu sa întâmplat nimic cu fișierele din subdirectoarele.
adăugat autor Harikrishnan T, sursa
Comanda "find" este mai bună pentru subdirectoarele.
adăugat autor Graham, sursa
Pentru exemplul bash citați $ i pentru a manipula fișiere cu spații în ele pentru
adăugat autor David Farrell, sursa

BashFAQ/056 does a decent job of explaining why what you tried doesn't work. Have a look.

Deoarece utilizați bash (în funcție de eroarea dvs.), comanda pentru este prietenul tău.

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

Dacă doriți să extrageți "text" dintr-un fișier, puteți face acest lucru:

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

Acum ... tu ar putea să aveți fișiere în subdirectoare. Dacă da, ați putea folosi comanda find pentru a le găsi și procesa:

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

Comanda find identifică ce fișiere utilizează condiții precum -name și -type , apoi comanda -exec același lucru pe care ți-am arătat-o ​​în bucla precedentă "pentru". Codul final \; indică find că acesta este sfârșitul argumentelor pentru opțiunea -exec .

Puteți găsi man find pentru mai multe detalii despre acest lucru.

Comanda find este portabilă și este, în general, recomandată pentru acest tip de activitate, mai ales dacă doriți ca soluția dvs. să fie portabilă altor sisteme. Dar, din moment ce utilizați în prezent bash , este posibil să puteți gestiona și subdirectoarele folosind opțiunea globstar a lui bash:

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

Puteți să man bash și să căutați "globstar" pentru mai multe detalii despre acest lucru.

NOTE: You may have other problems with what you're doing. PHP scripts don't need to end with a ?>, so you might be adding HTML that the script will try to interpret as PHP code.

0
adăugat
Comanda de căutare nu a funcționat.
adăugat autor Harikrishnan T, sursa
Nu a făcut nimic. Nu a returnat nicio eroare, dar nu a adăugat nici o linie în nici un fișier.
adăugat autor Harikrishnan T, sursa
Ce a făcut în loc să lucreze?
adăugat autor ghoti, sursa
Am actualizat comanda cu ceva care ar trebui să fie un pic mai flexibil. Dacă ne arătați linia de comandă actuală , am putea să depanem.
adăugat autor ghoti, sursa

Puteți face (Lucrați chiar dacă există un spațiu în calea fișierului dvs.):

#!/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;">

</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: You must run the script from the directory you want to browse

0
adăugat
util! Mulțumiri..
adăugat autor normalUser, sursa

Eu de obicei folosesc tee pentru că cred că pare puțin mai curat și se potrivește, în general, pe o linie.

echo "my text" | tee -a *.php
0
adăugat
@pamphlet, a fost de acord.
adăugat autor dre, sursa
Acesta este un răspuns Dantastic. :-) Și din moment ce OP utilizează bash, setarea globstar va permite, de asemenea, să se ocupe de fișierele PHP în subdirectoare.
adăugat autor ghoti, sursa
Un astfel de răspuns excelent.
adăugat autor pamphlet, sursa
dacă am nevoie să adaug un șir la mai multe fișiere specifice. Am mai multe instalări wordpress și trebuie să adaug un șir la sfârșitul fiecărui fișier numit functions.php. ar fi posibil acest lucru cu tee?
adăugat autor RobBenz, sursa

Puteți utiliza sed combinat cu find . Să presupunem că arborele dvs. de proiect este

    /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 there. Don't forget -i otherwise it will just print out the appended file and not save it.

Source: http://www.grymoire.com/unix/Sed.html#uh-37

0
adăugat