web-dev-qa-db-fra.com

comment créer un script BASH pour trouver tous les fichiers php.ini dans l'arborescence dir et y ajouter du texte

Ma société d'hébergement annonce une taille de téléchargement php max pouvant aller jusqu'à 60M mais, par défaut, elle est de 2M et je ne suis pas en mesure d'apporter des modifications au fichier htaccess. Je peux remplacer la valeur par défaut en modifiant les fichiers php.ini mais cela doit être fait pour chaque fichier php.ini dans l'arborescence de répertoires. Ce dont beaucoup d'utilisateurs et moi-même avons besoin et que nous implorons, c'est un script BASH qui fera la tâche suivante;

  1. trouver récursivement les fichiers php.ini
  2. scanner le fichier pour deux lignes de texte (nouvelles directives php)
  3. s'il n'a pas ces deux lignes de texte, ajoutez les deux lignes de texte. Enregistrez le fichier et passez au fichier suivant.
  4. s'il contient ces deux lignes de texte, ne faites rien et passez au fichier suivant.

J'ai trouvé comment trouver. -ifile php.ini et ajouter (pas correctement) les deux lignes devaient être ajoutées.

Même avec cela, si je découvre comment ajouter correctement les lignes s'il est exécuté à nouveau, il ajoutera à nouveau les lignes. Pas seulement aux nouveaux fichiers qui doivent être corrigés.

si quelqu'un pouvait m'aider

find . -ifile php.ini -exec ?????? '{}' \;

je pourrais comprendre comment faire le reste moi-même.

4
Larrykh465

Je choisirais cette approche:

#!/bin/bash
path='/path'
line1='foo'
line2='bar'
while read f; do
    if [ ! "$(grep "$line1" "$f")" ] && [ ! "$(grep "$line2" "$f")" ]; then
        echo "$line1" >> "$f"
        echo "$line2" >> "$f"
    fi
done < <(find "$path" -type f -name 'php.ini')

Quelques notes:

  • $path est déclaré/initialisé en interne, mais il peut très bien être passé en argument au script avec très peu/peu de modifications si cela est plus commode;
  • find "$path" -type f -name 'php.ini' est exécuté dans un shell externe et sa sortie est redirigée vers la boucle while à l'aide d'une substitution de processus, car la canalisation de sa sortie directement vers la boucle while aurait laissé $line1 et $line2 hors de la portée de la boucle while;
  • -type f dans find "$path" -type f -name 'php.ini' peut être redondant, mais juste pour être sûr;
  • Les deux commandes echo auraient pu être fusionnées en une seule commande echo, mais cela aurait nécessité d'ajouter une -e option pour échapper au \n séquence; sans connaître les chaînes exactes à ajouter (qui peuvent contenir d'autres séquences d'échappement), sans utiliser de -e et utiliser deux commandes echo est plus sûr;

Le script recherche, récursivement, tout fichier nommé php.ini dans le $path chemin; pour chaque fichier, si les deux commandes grep dans l'instruction ifDon't return 0 (c'est-à-dire si ni une ligne contenant/correspondant à $line1 chaîne ni ligne contenant/correspondant à $line2 chaîne se trouve dans le fichier), $line1 et $line2 sont ajoutés à la fin du fichier.

Exemple de sortie sur une hiérarchie de test:

user@debian ~/tmp % tree -a
.
├── 1
│   ├── 2
│   │   ├── 3
│   │   │   ├── file
│   │   │   └── php.ini
│   │   ├── file
│   │   └── php.ini
│   ├── file
│   └── php.ini
└── script.sh

3 directories, 7 files
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:

foo
bar
another line

1/file:

foo
bar
another line

1/2/3/php.ini:

foo
bar
another line

1/2/3/file:

foo
bar
another line

1/2/php.ini:

just one line

1/2/file:

foo
bar
another line

user@debian ~/tmp % bash script.sh                 
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:

foo
bar
another line

1/file:

foo
bar
another line

1/2/3/php.ini:

foo
bar
another line

1/2/3/file:

foo
bar
another line

1/2/php.ini:

just one line
foo
bar

1/2/file:

foo
bar
another line
2
kos