3 votes

Comment faire un remplacement de chaîne dans tous les fichiers PHP de manière récursive sous Linux ?

J'ai un nom de fonction qui a été mal orthographié et je veux le modifier. Cette fonction est appelée à de nombreux endroits du projet.

Comment puis-je faire ça avec une commande Linux sur SUSE ?

4voto

Dalroth Points 2468

Vous pouvez utiliser une combinaison de find , xargs y sed :

find ./ -type f -name "*.php" | xargs sed -i 's/\<oldfunction\>/newfunction/g'

0 votes

Attention ! Faire un s/he/him/ sur mon commentaire casserait "là", et ce serait difficile à réparer aussi simplement ! Faites des sauvegardes d'abord, et rappelez-vous que sed utilise des regex, donc vous avez une certaine marge de manœuvre dans la façon dont vous écrivez vos paramètres.

0 votes

Vous avez raison, c'est réparé.

0 votes

N'êtes-vous pas en train de rogner sur les environs < > Des personnages ? Tu ne veux pas s/\<oldfunction\>/\<newfunction\>/g ? ou est-ce que je ne reconnais pas un élément standard de RE ?

2voto

Keith Sirmons Points 2558

Une variante réalisée avec Perl :

find . -type f -name "*.php" -print0 | xargs -0 perl -pi.bak -e 's/oldfunction/newfunction/g'

L'avantage de cette méthode est que Perl créera les fichiers de sauvegarde (avec l'option .bak ) de sorte que si vous vous trompez, vous pouvez revenir en arrière.

(Le -print0 pour trouver et l'option -0 option pour xargs ne sont nécessaires que si vous avez des fichiers ou des répertoires contenant des espaces).

0 votes

Je pense que les versions sed le feront aussi si vous utilisez -i .bak au lieu de -i

0 votes

Aha, je viens de RTFM et ~quack a raison. sed va faire ça aussi.

0 votes

J'aimerais bien voir la variante Python (j'essaie de l'apprendre) :)

1voto

Nasir Points 416

C'est exactement la même chose que la solution de John T :

find ./ -type f -name "*.php" -exec sed -i 's/\<oldfunction\>/newfunction/g' {} \;

Je n'ai pas l'habitude de sortir pour xargs

EDIT : plus cher.... selon les commentaires ci-dessous.

0 votes

Il y a une différence : cela exécute une instance séparée de l'application sed pour chaque fichier trouvé ; le xargs exécute une instance avec de nombreux arguments.

0 votes

Ouais, plus de bifurcation impliquée.

1 votes

Si votre recherche le permet, utilisez + au lieu de \; et il réduira le nombre de processus sed pour qu'il imite xargs.

0voto

CarlF Points 8772

Complément aux autres très bonnes suggestions déjà postées : faites une sauvegarde de l'ensemble du site (cp -r /var/www /var/wold) et faites la modification à cet endroit. Personnellement, je déplacerais ensuite les fichiers modifiés sous, par exemple, /var/www/changed et je testerais http://www.sitename.tld/changed pour s'assurer que tous les scripts fonctionnent avant de mettre en ligne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X