Quelle commande concise puis-je utiliser pour rechercher tous les fichiers ne contenant PAS de chaîne de texte?
J'ai essayé ceci (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 cela grep -L *
suffira, mais je veux vraiment savoir comment utiliser la commande find en combinaison avec grep pour exclure des fichiers.
pss: De plus, je ne suis pas sûr de savoir comment grep inclut des sous-répertoires avec la grep -L *
syntaxe, mais je veux tout de même savoir comment l'utiliser avec find
:)
Réponses:
OU
Ici, nous calculons le nombre de lignes correspondantes (en utilisant
-c
) dans un fichier si le compte est 0, puis le fichier requis, nous avons donc coupé la première colonne, c’est-à-dire le nom du fichier, de la sortie.la source
grep
a été fixé cela supposerait toujours pas les noms de fichiers contenant:
ou newline caractères ...Votre recherche devrait fonctionner si vous modifiez
-v -l
(fichiers-L
ne contenant aucune ligne ne correspondant) en (fichiers sans lignes correspondant), mais vous pouvez également utilisergrep
l'-r
option récursive ( ):la source
find . -exec grep -v -l shared.php {} \;
(et toutes les autres variantes que j'ai essayées) ne fonctionne pas pour moi. Je suis sous OS X mais je ne pense pas que cela devrait compter. Je vous ai donné un +1 parce que j'avais oublié l'-r
option.-L
Vous pouvez utiliser
find
etgrep
comme ceci:Ici,
-print
n'est exécuté que si l'expression précédente:! -exec ... {}
évalue commetrue
.Donc, pour chaque fichier trouvé,
grep -q 'PATTERN'
estexec
uté, si le résultat estfalse
alors l'expression entière est! -exec grep -q 'PATTERN'
évaluée commetrue
et le nom du fichier estprint
édité.la source
grep -L
en ce sens qu'il inclura également les fichiers non lisibles dans la liste.Vous trouvez que le résultat ne correspond pas à l'option -L
la source
Je pense que vous cherchez une commande comme
L'option
-q
rendgrep
quit et après utilisation,-execdir
vous devez-print
imprimer les fichiers trouvés.la source