Ajouter un texte à la fin de plusieurs fichiers sous Linux

Je dois append le code suivant à la fin de tous les fichiers php dans un répertoire et son sous-répertoire:

J’ai essayé avec

 echo "my text" >> *.php 

Mais le terminal a montré l’erreur:

 bash : *.php: ambiguous redirect 

Que devrais-je faire. il y a des centaines de fichiers à append à ce segment de code et ce serait très difficile de l’append à chaque fichier. Merci d’avance.

Vous ne spécifiez pas le shell, vous pouvez essayer la commande foreach . Sous tcsh (et je suis sûr qu’une version très similaire est disponible pour bash), vous pouvez dire quelque chose comme interactivement:

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

$i prendrai le nom de chaque fichier à chaque fois dans la boucle.

Comme toujours, lorsque vous effectuez des opérations sur un grand nombre de fichiers, il est probablement judicieux de les tester dans un petit répertoire contenant des exemples de fichiers pour vous assurer qu’il fonctionne comme prévu.

Oups .. bash dans le message d’erreur (je vais taguer votre question avec elle). La boucle équivalente serait

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

Si vous souhaitez couvrir plusieurs répertoires sous celui où vous vous trouvez, vous pouvez spécifier

 */*.php 

plutôt que *.php

J’ai l’habitude d’utiliser le tee parce que je pense que ça a l’air un peu plus propre et ça tient généralement sur une seule ligne.

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

BashFAQ / 056 fait un travail décent d’expliquer pourquoi ce que vous avez essayé ne fonctionne pas. Regarde.

Comme vous utilisez bash (selon votre erreur), la commande for est votre ami.

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

Si vous souhaitez extraire un “texte” d’un fichier, vous pouvez plutôt faire ceci:

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

Maintenant … vous pouvez avoir des fichiers dans les sous-répertoires. Si oui, vous pouvez utiliser la commande find pour les rechercher et les traiter:

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

La commande find identifie les fichiers utilisant des conditions telles que -name et -type , puis la commande -exec exécute essentiellement la même chose que je vous ai montrée dans la précédente boucle “for”. Le final \; indique que c’est la fin des arguments de l’option -exec .

Vous pouvez man find beaucoup de détails à ce sujet.

La commande find est portable et est généralement recommandée pour ce type d’activité, en particulier si vous souhaitez que votre solution soit transférable à d’autres systèmes. Mais comme vous utilisez actuellement bash , vous pouvez également gérer des sous-répertoires en utilisant l’option globstar de bash:

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

Vous pouvez vous frayer un chemin et rechercher “globstar” pour plus de détails à ce sujet. Cette option nécessite la version 4 ou supérieure de bash.

REMARQUE : Vous pouvez avoir d’autres problèmes avec ce que vous faites. Les scripts PHP n’ont pas besoin de se terminer par un ?> , Vous pouvez donc append du HTML que le script essaiera d’interpréter en tant que code PHP.

Vous pouvez utiliser sed combiné avec find . Supposons que votre arbre de projet est

  /MyProject/ /MyProject/Page1/file.php /MyProject/Page2/file.php etc. 
  1. Enregistrez le code que vous souhaitez append sur /MyProject/ . Appelez-le append.txt
  2. De /MyProject/ run:

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

    Explique:

    • find est tel quel, il recherche tous les fichiers .php, y compris les sous-répertoires
    • xargs passera (c’est-à-dire exécutera) sed pour tous les .php qui viennent d’être trouvés
    • sed fera l’ajout. ‘$ r append.txt’ signifie aller à la fin du fichier ($) et y écrire (coller) tout ce qui se trouve dans append.txt. N’oubliez pas -i sinon, il suffit d’imprimer le fichier ajouté et de ne pas le sauvegarder.

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

Vous pouvez faire (Travailler même s’il y a de l’espace dans votre chemin de fichier):

 #!/bin/bash # Create a tempory file named /tmp/end_of_my_php.txt cat << EOF > /tmp/end_of_my_php.txt   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: vous devez exécuter le script à partir du répertoire que vous souhaitez parcourir