web-dev-qa-db-fra.com

Comment changer toutes les occurrences d'un mot dans tous les fichiers d'un répertoire

J'étais en train de créer une classe User où l'une des méthodes était get_privileges();.

Après des heures passées à me taper dessus au clavier, j'ai finalement découvert que le codeur précédent, dont j'avais hérité cette base de données particulière, épelait le mot "privilèges}" comme "privelages" dans la base de données MySQL, et donc aussi partout dans les centaines de fichiers qui accèdent à ces "privelages _" il est épelé de cette façon.

Existe-t-il un moyen sous Linux ( Ubuntu Server ) de parcourir tous les emplacements du dossier /var/www et de remplacer "privelages" par "privilèges", que je n'ai pas à traiter avec cette faute de frappe et le code autour de cela?

23
Ryan Ward

Une variante qui prend en compte les sous-répertoires (non testés):

find /var/www -type f -exec sed -i 's/privelages/privileges/g' {} \;

Ceci va find tous les fichiers (pas les répertoires, spécifiés par -type f) sous /var/www et exécuter une commande sed pour remplacer "privelages" par "privilèges" sur chaque fichier trouvé.

44
Dan Fego

Vérifiez ceci: http://www.cyberciti.biz/faq/unix-linux-replace-string-words-in-many-files/

cd /var/www
sed -i 's/privelages/privileges/g' *
5
cegfault

J'utilise généralement ce court script, qui renommera une chaîne dans tous les fichiers et tous les noms de répertoires et noms de fichiers. Pour l'utiliser, vous pouvez copier le texte ci-dessous dans un fichier appelé replace_string, exécuter Sudo chmod u+x replace_string, puis le déplacer dans votre dossier Sudo mv replace_string /usr/local/bin pour pouvoir l'exécuter dans n'importe quel répertoire. 

REMARQUE: cela ne fonctionne que sur linux (testé sur Ubuntu) et échoue sous MacOS. Faites également attention à cela, car cela peut gâcher des choses comme les fichiers git. Je ne l'ai pas testé non plus sur les fichiers binaires.

#!/usr/bin/env bash

# This will replace all instances of a string in folder names, filenames,
# and within files.  Sometimes you have to run it twice, if directory names change.


# Example usage:
# replace_string Apple banana

echo $1
echo $2

find ./ -type f -exec sed -i -e "s/$1/$2/g" {} \;  # rename within files
find ./ -type d -exec rename "s/$1/$2/g" {} \;    # rename directories
find ./ -type f -exec rename "s/$1/$2/g" {} \;  # rename files
1
matwilso