Modifier rapidement un ensemble de fichiers sous linux [BASH]
Vous vous trouvez sous Linux, vous désirez changer une chaîne de caractère avec une faute d'orthographe dans l'ensemble des fichiers d'un dossier? Utilisez le script suivant :
En Bref :
#!/bin/bash
for file in *.php
do
echo "Traitement de $file ..."
sed -e "s/eMssage avec erreur/Message sans erreur/g" "$file" > "$file".tmp && mv -f "$file".tmp "$file"
done
Pour cela, ouvrir une console :
- cd /chemin/dossier (placez vous dans le dossier concerné)
- touch monscript.sh (créer un fichier vide nommé monscript)
éditez le fichier et collez le script ci-dessus en faisant les changement nécessaire
- ./monscript.sh (executer lescript en local)
Le principe :
for file in *.php <- Tous les fichiers du répertoire qui finissent par l'extension .php
echo "Traitement de $file ..." <- On indique leur nom
sed -e "s/eMssage avec erreur/Message sans erreur/g" "$file" > "$file".tmp && mv -f "$file".tmp "$file"
<- On substitue (s) le premier message par le deuxième message, à toutes les lignes (g). On applique cela à tous les fichiers que l'on traite actuellement, et onrenomme les fichiers temporaires créés pour l'occasion
Plus d'info sur : http://fr.wikipedia.org/wiki/Sed_(logiciel)
Remplacer un texte dans des fichiers : Méthode évoluée
A présent je veux remplacer dans l'ensemble de mes fichiers .php la chaine "<?" par la chaîne "<?php". Evidemment, je ne veux pas remplacer les bonnes chaînes déjà existantes, sinon j'aurai : "<?<?php" ce qui ne sera pas bon.
Première méthode, je le fais à la bourrin, je remplace tous les "<?" puis je remplace les "<?<?" par "<?".
Deuxième méthode, je suis plus doux, et je vais : chercher les fichiers .php à modifer, effectuer la modification ciblée.
Pour trouver les fichiers à modifier :
- find /rep -name "*.php" | xargs grep "<?[^php]"
Le principe: le find permet de trouver les fichiers ayant l'extension .php. Le grep permet de trouver dans un fichier une expression donnée (ici "<?" privée de "php" à sa suite, voir expressions rationnelles). Le xargs permet de lire les fichiers envoyé par le pipe de find.
Si on a peur d'obtenir beaucoup de résultats on peux demander uniquement l'affichage du nom des fichiers en question :
- find /rep -name "*.php" | xargs grep -l "<?[^php]"
... ou bien plus de précision en demandant l'affichage de la ligne :
- find /rep -name "*.php" | xargs grep -n "<?[^php]"
Script à utiliser pour la modification :
#!/bin/sh
old_value="<?";
new_value="<?php";
ignore_value="<?php";
SUCCESS=0for file in $(find . -name "*.php")
do
echo "Traitment de : $file"
grep -q "$old_value" "$file"
if [ $? -eq $SUCCESS ]
# if grep -q "$word" "$filename" can replace lines 5 - 7.
then
mv $file $file.old2
sed "/$ignore_value/!s/$old_value/$new_value/g" < $file.old2 > $file
rm $file.old2
fi
done
On le place dans /html et on exécute. Pensez à sauver auparavant, sait-on jamais.

