J'essaie de boucler à travers chaque fichier d'un répertoire (y compris des fichiers dans ses sous-répertoires) et d'effectuer une action si le fichier répond à une condition IF-condition.
une partie de mon code est la suivante: p> Cependant, cela échoue dans le cas des sous-répertoires. Je serais très reconnaissant si quelqu'un pouvait m'aider. P> merci! P> p>
4 Réponses :
L'option -r code> à Grep lit tous les fichiers de l'arborescence de répertoires, y compris les sous-répertoires. Combinée avec l'option
-l code> pour imprimer uniquement les noms de fichiers correspondants, vous pouvez l'utiliser pour effectuer une action sur chaque fichier correspondant.
egrep -Rl pattern directory | while read path; do echo $path && mv $path /tmp; done
trouver | Xargs est le modèle habituel que j'utilise et présente l'avantage de ne pas avoir raccroché sur des caractères spéciaux dans les noms de fichiers (espaces, etc.) Si vous utilisez l'option -Print0 de recherche.
find . -type f -print0 | xargs -0 -I{} sh -c "if grep -q 'search string' '{}'; then cmd-to-run '{}'; fi"
Oui, car avec cette syntaxe, en réalité, vous voudrez probablement obtenir la liste des fichiers avec patte et agir sur ceux: p> J'ai opté pour obtenir la liste des fichiers via grep code> attendez-vous à traiter les fichiers non répertoires. Un changement minimal de votre script serait de tester si
$ f code> est un fichier ou non:
car la tuyautage dans
tandis que code> entraînerait l'intermédiaire de votre boucle dans un autre processus (ce qui pourrait être un problème en particulier si vous vous attendez à ce que toute variable (changements) soit accessible de l'extérieur. Et contrairement à simple pour avec
`` Code> Ce n'est pas aussi sensible à ce que vous rencontrez des noms de fichiers (à savoir que j'ai des espaces, cela serait toujours confus par les nouvelles lignes). Parler de laquelle: P>
while read -d "" f; do
: #action on file file $f
done < <(grep -rZl 'search_term' $direc/)
Assumer aucune nouvelle ligne dans vos noms de fichiers:
find "$direc" -type f -exec grep -q 'search_term' {} \; -print | while IFS= read -r f; do #action on this file done