0
votes

Recherche dans chaque fichier dans un répertoire (et dans tous les sous-répertoires) un par un

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: XXX

Cependant, cela échoue dans le cas des sous-répertoires. Je serais très reconnaissant si quelqu'un pouvait m'aider.

merci!


0 commentaires

4 Réponses :


0
votes

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


0 commentaires

0
votes

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"


0 commentaires

0
votes

Oui, car avec cette syntaxe, 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: xxx pré>

en réalité, vous voudrez probablement obtenir la liste des fichiers avec patte et agir sur ceux: p> xxx pré>

J'ai opté pour obtenir la liste des fichiers via 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/)


0 commentaires

0
votes

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


0 commentaires