web-dev-qa-db-fra.com

Comment puis-je trouver tous les fichiers qui ne contiennent PAS de chaîne de texte?

Quelle commande concise puis-je utiliser pour rechercher tous les fichiers qui ne contiennent PAS de chaîne de texte?

J'ai essayé cela (en utilisant -v pour inverser les paramètres de grep) sans succès:

find . -exec grep -v -l shared.php {} \;

Quelqu'un a dit que cela fonctionnerait:

find . ! -exec grep -l shared.php {} \;

Mais cela ne semble pas fonctionner pour moi.

Cette page a cet exemple:

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

Mais c'est lourd et pas du tout concis.

ps: je sais que grep -L * fera cela, mais comment puis-je utiliser la commande find en combinaison avec grep pour les fichiers exclus est ce que je veux vraiment savoir.

pss: Je ne sais pas non plus comment inclure grep dans les sous-répertoires avec le grep -L * syntaxe, mais je veux quand même savoir comment l'utiliser avec find :)

40
cwd
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

OR

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

Ici, nous calculons le nombre de lignes correspondantes (en utilisant -c) dans un fichier si le nombre est 0 alors c'est le fichier requis, donc nous coupons la première colonne, c'est-à-dire le nom de fichier de la sortie.

9
Sachin Divekar

Votre recherche devrait fonctionner si vous modifiez -v -l (fichiers dont la ligne ne correspond pas) à -L (fichiers sans lignes correspondantes), mais vous pouvez également utiliser le récursif de grep (-r) option:

grep -rL shared.php .
61
Kevin

Je le sais grep -L * fera cela, mais comment puis-je utiliser la commande find en combinaison avec grep pour exclure des fichiers est ce que je veux vraiment savoir

Vous pouvez utiliser find et grep comme ceci:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

Ici -print n'est exécuté que si l'expression précédente: ! -exec ... {} est évalué comme true.
Donc pour chaque fichier trouvé, grep -q 'PATTERN' est executed, si le résultat est false alors l'expression entière ! -exec grep -q 'PATTERN' est évalué comme true et le nom du fichier est printed.

4
don_crissti

Vous ne trouvez pas de résultat correspondant à l'option -L

grep -iL shared.php .
1
prakash