Pourquoi cette commande bash occupe-t-elle tout l'espace sur le périphérique?

5

Je suis un peu nouveau sur la recherche via bash, alors n'hésitez pas à me donner suggestions sur les méthodes à utiliser au lieu de cela, que je n'utiliserai plus jamais.

Je cherche occurrences d'une chaîne, de manière récursive dans un répertoire , avec environ 50 fichiers php pas très volumineux; certains dans le répertoire en cours, certains dans les répertoires situés sous le répertoire en cours, trois niveaux de répertoires au plus.

La méthode que j'utilise est

find . | xargs grep "module" > module.txt

Dans les répertoires simples (à un niveau), cela fonctionne bien, mais dans ce cas, le fichier a pris 4 Go jusqu'à ce qu'il soit rempli. tout l'espace sur la partition . Ce n'était même pas encore fait.

Pourquoi ce fichier devient-il si volumineux?

chelmertz
la source
8
Comprendre la récursion, c'est comprendre la récursivité
Tim Post
7
Pourquoi fermer? C'est essentiellement un cas de récursion involontaire. En tant que concept, il est certainement lié à la programmation.
L'interaction avec Shell semble être une question délicate pour la sélection de sites. Des coques sont des programmes que vous utilisation , d’autre part, ce sont des langages complets de Turing dans lesquels on écrit programmes . La sélection du site dépend donc de votre décision de "programmer" ou non. Ceci est un one-liner qui je aurait introduit sur Super User en premier lieu, mais il est assez d'un problème de programmeur pour que je ne voterais pas pour le déplacer.
dmckee

Réponses:

20

module.txt est créé avant le début du pipeline, il est donc inclus dans la recherche. grep trouve une instance de "module" dedans, une ligne contenant le mot "module" y est ajoutée. Ce que grep trouve ensuite et ajoute. Ce que grep trouve ensuite et ajoute. Ce que grep trouve ensuite et ajoute. Lequel...

Ignacio Vazquez-Abrams
la source
Méchant. Ok, c'est le problème, pourriez-vous me proposer une solution? C'est à dire. avec une autre syntaxe ou juste quelque chose à ajouter à cette recherche?
chelmertz
2
@OP: La solution est de s'assurer que votre nom de fichier de résultat ne contient pas le mot clé de recherche.
user22644
6
Stockez le fichier en dehors des paramètres de recherche.
Ignacio Vazquez-Abrams
@ Coddadict: bien sûr, +1. Serait-ce plus rapide ou plus lent que ce que @MBO a suggéré?
chelmertz
@OP: Je suppose que l'utilisation de l'option récursive avec grep (comme suggéré par MBO) pourrait être plus rapide que cette solution, puisqu’un seul processus sera impliqué et qu’il n’y aura pas d’IPC. D'autres encore postent votre avis.
user22644
1

Et quelle est la sortie sans > module.txt.

Pourquoi ne pas essayer d'utiliser grep -R "module" . > ../module.txt?

MBO
la source
1
find /path -type f -iname "*.php" | while read -r FILE
do
  grep -H "module" "$FILE" >> "file_with_search_term_found.txt"
done

Ou si votre grep a une fonction récursive,

grep -RH "module" *.php

Ou avec shell bash 4.0

shopt -s globstar
for file in /path/**/*.php
do
   if [ -f "$file" ];then
      while read -r line 
      do
         case "$line" in
           *module* ) echo $line >> module.txt;;
         esac    
      done <"file"      
   fi

done
user31894
la source
Ou find -name '*.php' -exec grep -q -H "module" {} \; -print > ../module.txt.
Ignacio Vazquez-Abrams
je préfère find /path -type f -iname "*.php" -exec grep -q -H "module" "{}" +; ...
user31894