开发者

grep returns "Too many argument specified on command" [duplicate]

This question already has answers here: Argument list too long error for rm, cp, mv commands (31 answers) Closed 7 years ago.

I am trying to list all files we received in one month

The filename pattern will be

20110101000000.txt

YYYYMMDDHHIISS.txt

The entire directory is having millions of files. For one month there can be minimum 50000 files. Idea of sub directory is still pending. Is there any way to list huge number of files with file name almost similar.

grep -l 20110101*    

Am trying this and returning error. I try php it took a huge time , thats why i use shell script . I dont understand why shell also not giving a res开发者_运维百科ult Any suggestion please!!


$ find ./ -name '20110101*' -print0 -type f | xargs -0 grep -l "search_pattern"

you can use find and xargs. xargs will run grep for each file found by find. You can use -P to run multiple grep's parallely and -n for multiple files per grep command invocation. The print0 argument in find separates each filename with a null character to avoid confusion caused by any spaces in the file name. If you are sure there will not be any spaces you can remove -print0 and -0 args.


This should be the faster way:

find . -name "20110101*" -exec grep -l "search_pattern" {} +

Should you want to avoid the leading dot:

find . -name "20110101*" -exec grep -l "search_pattern" {} + | sed 's/^.\///'

or better thanks to adl:

find . -name "20110101*" -exec grep -l "search_pattern" {} + | cut -c3-


The 20110101* is getting expanded by your shell before getting passed to the command, so you're getting one argument passed for every file in the dir that starts with 20110101.

If you just want a list of matching files you can use find:

find . -name "20110101*"

(note that this will search every subdirectory also)


Some in depth information available here and also another work-around: for FILE in 20110101*; do grep foo ${FILE}; done. Most people will go with xargs and more seasoned admins with -exec {} + which accomplishes exactly the same, except is shorter to type. One would use the inline shell for construct, when running more processes is less important then seeing the results. With the for construct you may end up running grep thousands of times, but you see each match in real time, while using find and/or xargs you see batched results, however grep is run significantly less.


you need to put in a search term, so

grep -l "search term" 20110101*

if you want to just find the files, use ls 20110101*


Just pipe the output of ls to grep:

ls | grep '^20110101'

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜