2012-06-02 20 views
17

ho bisogno di aggiungere il seguente codice alla fine a tutti i file PHP in una directory e la sua sub directory:Appendi un testo alla fine di più file in Linux

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

Ho provato con

echo "my text" >> *.php 

Ma terminale mostrato l'errore:

bash : *.php: ambiguous redirect 

Cosa devo fare. ci sono centinaia di file per aggiungere questo segmento di codice e sarebbe un vero momento difficile aggiungerlo in ogni file. Grazie in anticipo.

risposta

10

Non si specifica la shell, si potrebbe provare il comando foreach. Sotto tcsh (e sono sicuro che una versione molto simile è disponibile per bash) si può dire qualcosa di simile in modo interattivo:

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

$i assumerà il nome di ogni file ogni volta attraverso il ciclo.

Come sempre, quando si eseguono operazioni su un gran numero di file, è probabilmente una buona idea testarli in una piccola directory con file di esempio per assicurarsi che funzioni come previsto.

Oops .. bash nel messaggio di errore (codificherò la domanda con esso). Il ciclo equivalente sarebbe

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

Se si vuole coprire più directory sotto quella in cui siete è possibile specificare

*/*.php 

piuttosto che *.php

+0

Che dire i file nelle sottodirectory? Devo aggiungere anche questo. PS: ho usato il comando 'for i in $ un fare echo "il codice" >> $ i done' Ma in tutti i file in essa allegata due volte e non è successo niente ai file nelle directory secondarie. –

+3

Il comando "trova" è migliore per le sottodirectory. – Graham

+0

Per l'esempio bash, citare '$ i' per gestire i file con spazi al loro interno per –

9

BashFAQ/056 fa un lavoro decente di spiegare perché quello che hai provato non funziona. Dare un'occhiata.

Dato che stai utilizzando bash (in base al tuo errore), il comando for è tuo amico.

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

Se vuoi tirare "testo" da un file, si potrebbe invece fare questo:

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

Ora ... si potrebbe dispone di file nelle sottodirectory. Se è così, è possibile utilizzare il comando find per trovare e elaborarli:

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

Il comando find identifica quali file utilizzando condizioni come -name e -type, quindi il comando -exec corre fondamentalmente la stessa cosa che si ha mostrato nel precedente "per" ciclo. L'\; finale indica a find che questa è la fine degli argomenti per l'opzione -exec.

È possibile man find per molti altri dettagli su questo.

Il comando find è portatile ed è generalmente consigliato per questo tipo di attività, soprattutto se si desidera che la soluzione sia portabile su altri sistemi. Ma dal momento che si sta attualmente utilizzando bash, si può anche essere in grado di gestire le sottodirectory utilizzando l'opzione di bash globstar:

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

È possibile man bash e cercare "globstar" per maggiori dettagli su questo.

NOTA: Potresti avere altri problemi con quello che stai facendo. Gli script PHP non richiedono per terminare con uno ?>, quindi potresti aggiungere HTML che lo script proverà ad interpretare come codice PHP.

+0

Il comando find non ha funzionato. –

+0

Cosa ha fatto invece di funzionare? – ghoti

+0

Non ha fatto nulla.Non è stato restituito alcun errore, ma non è stata aggiunta alcuna riga in alcun file. –

1

Si può fare (lavoro, anche se c'è spazio nel vostro percorso del file):

#!/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: È necessario eseguire lo script dalla directory che si desidera navigare

+0

utile! Grazie .. – normalUser

52

Io di solito uso tee perché io penso che sembra un po 'più pulito e generalmente si adatta su una sola riga.

echo "my text" | tee -a *.php 
+0

Una grande risposta. – pamphlet

+0

@pamphlet, d'accordo. – dre

+0

Questa è una risposta Dantastica. :-) E poiché l'OP sta usando bash, l'impostazione di globstar consentirà anche di gestire i file PHP nelle sottodirectory. – ghoti

1

È possibile utilizzare sed combinato con find. Si supponga il vostro albero di progetto è

/MyProject/ 
    /MyProject/Page1/file.php 
    /MyProject/Page2/file.php 
    etc.   
  1. salvare il codice si desidera aggiungere il /MyProject/. Chiamatela append.txt
  2. Da /MyProject/ run:

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

    spiego:

    • find fa così com'è, sembra per tutti .php, incluse le sottodirectory
    • xargs passerà (cioè run) sed per tutti i file .php appena trovati
    • sed farà l'accodamento. '$ r append.txt' significa andare alla fine del file ($) e scrivere (incollare) ciò che è in append.txt lì. Non dimenticare -i altrimenti stamperà semplicemente il file allegato e non lo salverà.

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

Problemi correlati