Recherche dans de nombreux files

Existe-t-il une technique sophistiquée pour searchr des strings dans de nombreux files?

J'ai essayé cette technique de base

for i in `find .`; do grep searched_ssortingng "$i"; done; 

Il n'a pas l'air sophistiqué et de plus il n'a rien trouvé dans la hiérarchie des files.

Vous pouvez faire l'un des

grep pattern_search . # fait un grep normal sur le directory courant

grep pattern_search * # utilise un grep normal sur tous les files globbed du directory courant

grep -R pattern_search . # utiliser une search récursive dans le directory courant

grep -H pattern_search * # grep -H pattern_search * nom de file lorsque les files sont plus d'un. '-H'

D'autres options telles que (du manuel GNU):

 --directories=action If an input file is a directory, use action to process it. By default, action is 'read', which means that directories are read just as if they were ordinary files (some operating systems and file systems disallow this, and will cause grep to print error messages for every directory or silently skip them). If action is 'skip', directories are silently skipped. If action is 'recurse', grep reads all files under each directory, recursively; this is equivalent to the '-r' option. --exclude=glob Skip files whose base name matches glob (using wildcard matching). A file-name glob can use '*', '?', and '['...']' as wildcards, and \ to quote a wildcard or backslash character literally. --exclude-from=file Skip files whose base name matches any of the file-name globs read from file (using wildcard matching as described under '--exclude'). --exclude-dir=dir Exclude directories matching the pattern dir from recursive directory searches. -I Process a binary file as if it did not contain matching data; this is equivalent to the '--binary-files=without-match' option. --include=glob Search only files whose base name matches glob (using wildcard matching as described under '--exclude'). -r -R --recursive For each directory mentioned on the command line, read and process all files in that directory, recursively. This is the same as the --directories=recurse option. --with-filename Print the file name for each match. This is the default when there is more than one file to search. 

J'utilise:

 find . -name 'whatever*' -exec grep -H searched_ssortingng {} \; 

En s'appuyant sur la réponse de Chris Card, j'utilise moi-même: find . -print0 | xargs -r0 grep -H searched_ssortingng find . -print0 | xargs -r0 grep -H searched_ssortingng find . -print0 | xargs -r0 grep -H searched_ssortingng -print0 combiné avec -0 dans xargs garantit que les espaces dans les noms de files sont gérés correctement. Le -r request à xargs de donner au less un nom de file sur la command line. J'utilise aussi généralement fgrep si je veux des strings fixes (pas d'expression régulière), ce qui est un peu plus rapide.

Utilisation de find . -print0 | xargs -0 cmd find . -print0 | xargs -0 cmd find . -print0 | xargs -0 cmd est plus rapide que find . -exec cmd {} \; find . -exec cmd {} \; . C'est légèrement plus lent que find . -exec cmd {} + find . -exec cmd {} + , mais plus largement disponible puis l'utilisation -exec +.

Consultez ack-grep . C'est parfait pour les searchs rapides, et obtient des points bonus pour ignorer les directorys .svn par défaut. Il affiche le nom de file et le numéro de ligne sur l'location où la string a été trouvée.

 ack-grep -a Fnord 

Si vous ajoutez un / dev / null dans votre command, vous obtiendrez également le nom du file où la string est appariée:

 for i in `find .`; do grep searched_ssortingng "$i" /dev/null ; done; 

Un model non encore mentionné est:

 find . -name "<filename>" | xargs grep "<>" 

Comme dans

 find . -name Makefile | xargs grep -v "target" 

pour find dans tous vos Makefiles qui manque une cible particulière.