2012-06-02 13 views
17

tengo que añadir el siguiente código al final de todos los archivos php de un directorio y sus sub directorio:append un texto al final de varios archivos en Linux

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

He tratado con

echo "my text" >> *.php 

Pero terminales mostraron el error:

bash : *.php: ambiguous redirect 

¿Qué debería hacer. hay cientos de archivos para agregar este segmento de código y sería realmente difícil agregarlo en cada archivo. Gracias por adelantado.

Respuesta

10

No especifica el shell, puede probar el comando foreach. Bajo tcsh (y estoy seguro de una versión muy similar está disponible para bash) se puede decir algo como forma interactiva:

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

$i asumirá el nombre de cada archivo cada vez a través del bucle.

Como siempre, al realizar operaciones en una gran cantidad de archivos, probablemente sea una buena idea probarlos en un pequeño directorio con archivos de muestra para asegurarse de que funciona como se esperaba.

Vaya ... bash en el mensaje de error (voy a etiquetar su pregunta con él). El bucle equivalente sería

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

Si desea cubrir múltiples directorios por debajo de aquel en el que está puede especificar

*/*.php 

en lugar de *.php

+0

¿Qué pasa con los archivos en los subdirectorios? Necesito anexarlo también. PD: utiliza el comando ' para i en $ a hacer echo "el código" >> $ i done' Pero en todos los archivos que añade dos veces y no pasó nada a los archivos en los subdirectorios. –

+3

El comando "buscar" es mejor para los subdirectorios. – Graham

+0

Para la cita de ejemplo bash '$ i' para manejar archivos con espacios en ellos para –

9

BashFAQ/056 hace un trabajo decente de explicar por qué lo que probaste no funciona. Echar un vistazo.

Dado que está utilizando bash (según su error), el comando for es su amigo.

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

Si desea tirar de "texto" de un archivo, en lugar podría hacer esto:

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

Ahora ... fuerza tiene archivos en los subdirectorios. Si es así, usted podría utilizar el comando find de encontrar y procesarlos:

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

El comando find identifica qué archivos utilizando condiciones como -name y -type, a continuación, los -exec comando se ejecuta básicamente la misma cosa que se mostraron en el anterior "en bucle. El \; final indica a find que este es el final de los argumentos de la opción -exec.

Puedes man find para obtener más detalles al respecto.

El comando find es portátil y, en general, se recomienda para este tipo de actividad, especialmente si desea que su solución sea portátil para otros sistemas. Pero desde que está utilizando actualmente bash, también puede ser capaz de manejar los subdirectorios utilizando la opción de fiesta globstar:

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

Puede man bash y busque "Globstar" para más detalles sobre esto.

NOTA: Es posible que tenga otros problemas con lo que está haciendo. Las secuencias de comandos PHP no necesitan para terminar con ?>, por lo que puede estar agregando HTML que la secuencia de comandos intentará interpretar como código PHP.

+0

El comando find no funcionó. –

+0

¿Qué hizo en lugar de trabajar? – ghoti

+0

No hizo nada.No devolvió ningún error, pero tampoco agregó ninguna línea en ningún archivo. –

1

Puede hacer (trabajo incluso si no hay espacio en su ruta de archivo):

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

PD: debe ejecutar el script desde el directorio que desea examinar

+0

¡útil! Gracias .. – normalUser

52

Yo suelo usar camiseta porque creo que se ve un poco más limpio y generalmente cabe en una línea.

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

Una gran respuesta. – pamphlet

+0

@pamphlet, de acuerdo. – dre

+0

Esta es una respuesta fantástica. :-) Y dado que OP está utilizando bash, la configuración de globstar también le permitirá manejar archivos PHP en subdirectorios. – ghoti

1

Se puede utilizar en combinación con sedfind. Suponga que su árbol del proyecto es

/MyProject/ 
    /MyProject/Page1/file.php 
    /MyProject/Page2/file.php 
    etc.   
  1. Guardar el código que desea anexar en /MyProject/. Llamarlo append.txt
  2. De /MyProject/ de ejecución:

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

    Explicar:

    • find hace como es, se ve por todas .php, incluyendo subdirectorios
    • xargs pasará (por ejemplo ejecutar) sed para todos los .php que acabamos de encontrar
    • sed hará el anexar. '$ r append.txt' significa ir al final del archivo ($) y escribir (pegar) lo que esté en append.txt allí. No olvide -i de lo contrario, simplemente imprimirá el archivo adjunto y no lo guardará.

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

Cuestiones relacionadas