2008-11-21 23 views
1

Espérons que ce soit simple et agréable.Comment remplacer 'php3' par 'php' dans tous les fichiers d'un répertoire

J'ai un site php3 que je veux courir sur php 5.2

Pour commencer, je voudrais juste avoir toutes les références au courant « index.php3 » _within_each_file_ (récursive) a changé à " index.php ", puis passez à s'inquiéter des globales, etc.

K. Go!

:)

Mise à jour: Merci beaucoup! Je me rends compte que ma question a manqué le fait que les références sont dans chaque dossier d'un site Web et je voulais le faire récursivement dans tous les dossiers/chemises.

+0

Komodo a une fonction pour le faire. –

Répondre

5
find -type f -exec perl -pi -e 's/\bindex\.php3\b/index.php/g' {} \; 
+0

Merci Joshua! Travaillé parfaitement. – Gareth

2

sed -i 's/php3/php/g' *

En supposant que vous utilisez un système d'exploitation unix.

+0

Et un avec GNU sed - qui ne fonctionnera pas avec les versions non-GNU de sed. –

+0

Nittpick mineur, @Jonathan - vous auriez du mal à trouver un UNIX sans GNU sed de nos jours. – paxdiablo

+0

Trouvez-moi un système de type Unix exécutant PHP qui ne possède pas de version GNU de sed :) –

4

Que diriez-vous:

for file in *.php3 
do 
    sed 's/\.php3/.php/g' $file > ${file%3} 
done 

Le pour/do/fait en boucle avec traite chaque fichier .php3 à son tour, la modification du fichier et le remplacement de chaque chaîne .php3 avec .php, et la copie du fichier de something.php3 à something.php.

Ajouté pour la question modifiée:

for file in $(find . -type f -name '*.php3' -print) 
do 
    sed 's/\.php3/.php/g' $file > ${file%3} 
done 

Le « -print » peut être omis ces jours-ci, mais historiquement, beaucoup de temps de la machine a été gaspillée par des gens qui ont oublié de l'ajouter parce qu'il y avait à l'origine (pré-POSIX) aucune action par défaut.

Ce fragment est la modification la plus simple du code original pour faire la tâche étendue, mais ce n'est pas nécessairement la meilleure façon de le faire - il pré-génère la liste entière des fichiers avant d'en traiter. Vous pouvez utiliser à la place:

find . -type f -name '*.php3' -print | 
while read file 
do 
    sed 's/\.php3/.php/g' $file > ${file%3} 
done 

Cependant, les versions modifiées peuvent rencontrer des problèmes si les noms de fichiers ou des chemins d'accès peuvent contenir des espaces ou des sauts de ligne ou d'autres caractères. Pour éviter de tels problèmes, vous devez travailler plus dur - en utilisant Perl ou (GNU find + xargs) ou d'autres techniques. Si vous êtes sain d'esprit, vous évitez de tels problèmes. Si vous avez hérité d'une configuration moins que entièrement saine, vous devrez peut-être vous plonger plus profondément dans l'arcana de la gestion des noms de fichiers Unix.

+0

Salut Jonathan. Merci, mais j'ai besoin de changer la référence php3 dans chaque fichier. Le seul fichier avec php3 est index.php3 et c'est ce que tout le code appelle :) d'où le besoin de changer. À la vôtre. – Gareth

+0

La technique de base reste la même - peaufiner les détails est la principale différence. Si les fichiers sont déjà renommés, utilisez 'sed ... $ file> tmp. $$; mv $ fichier ancien. $ fichier; mv tmp. $$ $ file ', par exemple. Ou utilisez 'perl -i.bak' et le code approprié. Ou ... –

1

Pour ce faire de manière récursive, utilisez la réponse de Jonathan, mais remplacez-la par find . -type f pour * .php3. Notez que les ticks de retour sont importants et vous pouvez remplacer n'importe quel répertoire par "." (c'est-à-dire le répertoire courant). Voici une version qui renomme aussi le fichier dans le processus (* .php3 -> * .php).

#!/bin/bash 
for file in `find . -type f` 
do 
    sed 's/\.php3/\.php/g' $file > ${file//3/} 
    rm $file 
done 
+0

Hey ctuffli J'ai fait le script à la racine de la webdir (une nouvelle copie bien sûr) et l'ai couru. Il a mangé tous les fichiers du répertoire sauf index.php (qu'il a renommé). Assez le résultat impair. – Gareth

+0

Sous quel OS avez-vous essayé cela? Le script n'a mangé aucun fichier sur mon système OS X. – ctuffli