1 votes

Recherche et remplacement dans les fichiers .htaccess sous linux

J'ai besoin d'ajouter cette ligne à chaque fichier .htaccess qui se trouve dans un fichier /home/*/site/assets/.htaccess où * peut être un nombre quelconque de répertoires profonds

J'ai besoin d'affiner ce texte

RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS]

et ajoutez une ligne au-dessus, ou remplacez-la par ceci

RewriteCond %{REQUEST_URI} !^/site/assets/sym
RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS]

J'ai regardé en ligne sur ce site site mais je ne sais pas comment traiter

  1. générer une liste des fichiers que je veux modifier (donc trouver tous les fichiers qui correspondent à ce chemin : /home/*/site/assets/.htaccess)
  2. Ajout de sauts de ligne dans le texte de remplacement

Quelqu'un peut-il me suggérer une ressource qui l'explique clairement ou, à défaut, me faire savoir si j'utilise les bons outils pour ce travail ?

Mon système d'exploitation est Cent OS 5.5, j'utilise un serveur LAMP si cela fait une différence, apache 2.

Gracias

0 votes

Ce site n'est pas destiné à donner des conseils en matière de programmation. Donc, juste un indice : Perl peut le faire ! Et il y a plus d'une solution pour cela.

1 votes

C'est vrai, mais il s'agit d'une tâche typique de l'administrateur système ? Je ne le signalerais pas pour le déplacer, mais c'est peut-être juste moi.

2voto

Kvisle Points 4083

Vous avez choisi un excellent ensemble d'outils pour ce travail !

Générer une liste de fichiers que vous voulez éditer est très simple - je suppose ici que vous utilisez un Shell qui développera la sortie des noms de fichiers correspondants, comme bash, ou dash :

echo /home/*/site/assets/.htaccess > list.txt

Toutefois, si * peut signifier plus d'un niveau de répertoires, j'irais avec ceci :

find -name '.htaccess' /home | grep '/site/assets/sym' > list.txt

Votre Shell va développer l'expression en une liste, et rediriger la sortie vers list.txt. Un fichier pour chaque ligne.

Vous pouvez également rechercher les fichiers nommés .htaccess avec find - pour voir s'il y en a un que vous avez manqué, comme ceci :

find -name '.htaccess' /home

Ajout de sauts de ligne dans le texte de remplacement - cela dépend un peu de votre éditeur. Les sauts de ligne sont généralement représentés par \n

Ce que vous voulez faire, peut probablement être réalisé avec un petit Shell-Shell - quand for variable in expression; do .... done est utilisé, il exécutera les lignes entre do/done une fois pour chaque mot de l'expression. NOTE : Cela peut se retourner contre vous si les chemins contiennent des espaces.

for file in /home/*/site/assets/.htaccess; do
    sed 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/g' $file > $file.new
    mv $file $file.old
    mv $file.new $file
done

(Cela laissera un fichier nommé .htaccess.old à sa place).

Réécrit pour une approche alternative de collecte de listes :

for file in $(find -name '.htaccess' /home | grep '/site/assets/sym'); do
    sed 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/g' $file > $file.new
    mv $file $file.old
    mv $file.new $file
done

Ou, en une ligne, sans prendre de sauvegarde :

for file in /home/*/site/assets/.htaccess; do sed -i 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/g' $file; done

0 votes

+1 pour l'effort fourni jusqu'à présent, cela me mène définitivement dans la bonne direction. Cet article a soulevé d'autres questions auxquelles je viens de penser. Le Shell Shell ne créera-t-il un fichier .old que si la ligne recherchée existe ? ou recréera-t-il tous les fichiers .htaccess, qu'ils contiennent ou non cette ligne ?

0 votes

De plus, la commande echo ne fonctionnait pas tout à fait, cat list.txt /home/*/site/assets/.htaccess

0 votes

Je pense que la commande echo n'a pas fonctionné parce que vous avez plusieurs niveaux de répertoires. Je dois également noter que vous devez utiliser bash. Pour répondre à la question du fichier ".old", oui, il ne le fera que si le fichier existe. Il exécute les trois lignes une fois pour chaque fichier trouvé.

2voto

user9517 Points 113163

Vous pouvez utiliser sed pour insérer la ligne au-dessus du motif correspondant et faire des sauvegardes au fur et à mesure.

for file in  $( find /home -name .htaccess | grep /site/assets/sym); do
    sed -i.bak '/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/i RewriteCond %{REQUEST_URI} !^/site/assets/sym' "$file"
done
  • sed -i.bak éditera les fichiers en place et créera un fichier .bak pour chacun d'eux.
  • /PATTERN/i un autre modèle - correspondre au PATTERN et insérer un autre modèle avant elle.

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