2011-05-09 40 views
3

我想列出我們在一個月內收到的所有文件「關於命令指定了太多參數」grep的回報

的文件名模式將是

20110101000000.txt 

YYYYMMDDHHIISS.txt 

整個目錄有百萬計的文件。 一個月可以有至少50000個文件。 子目錄的想法仍然未決。 有什麼辦法可以列出文件名與文件名幾乎相似的大量文件。

grep -l 20110101*  

我正在嘗試此操作並返回錯誤。 我嘗試PHP花了很長的時間,這就是爲什麼我使用shell腳本。我不明白爲什麼貝殼也沒有給出結果 請任何建議!

+0

2011年問的這個問題是在2012年詢問的問題的重複! – zod 2015-10-06 15:29:53

+0

相關:[是否「參數列表太長」 適用於shell builtins?](https://stackoverflow.com/questions/47443380/does-argument-list-too-long-restriction-apply-to-shell-builtins ) – codeforester 2017-11-23 00:45:54

回答

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

你可以使用find和xargs。 xargs會爲find找到的每個文件運行grep。您可以使用-P爲每個grep命令調用的多個文件並行運行多個grep並運行-n。 find中的print0參數用空字符分隔每個文件名,以避免由文件名中的任何空格造成的混淆。如果您確定不會有空間,您可以刪除-print0和-0參數。

+0

謝謝。我想要「找到」返回唯一的文件名。現在它正在返回./filename。我嘗試使用。但它也不是 – zod 2011-05-09 15:59:18

+0

避免無用的xargs。找到解決方案會更簡單,速度更快。 – jlliagre 2011-05-09 20:22:13

0

你需要把一個搜索詞,所以

grep -l "search term" 20110101* 
如果你只想找到文件

,使用ls 20110101*

0

只是管LS的輸出到grep:

ls | grep '^20110101'

+0

謝謝,我怎麼能把一個搜索條件呢? – zod 2011-05-09 15:25:23

+0

@zod:你的問題似乎表明你只想要一個目錄中名稱以「20110101」開頭的所有文件的列表,它使用「'^ 20110101」作爲模式來搜索'ls'的輸出。 – jwodder 2011-05-09 16:10:52

1

的20110101 *是越來越被外殼程序獲得通過的命令之前擴大了,所以你要通過在與20110101.

啓動目錄的每個文件一個參數如果你只是想清單匹配的文件,你可以使用發現:

find . -name "20110101*" 

(注意,這將每一個子目錄還搜索)

2

這應該是更快的方法:

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

如果你想避開前面的點:

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

或更好的感謝ADL:

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

+1

'| cut -c3-'也是刪除每行的前兩個字符的簡單方法。 – adl 2011-05-26 20:17:23

+0

事實上,速度也更快。 – jlliagre 2011-05-27 21:58:01

1

一些深入的信息提供here也是另一個工作 - 約:for FILE in 20110101*; do grep foo ${FILE}; done。大多數人會使用xargs和更經驗豐富的管理員使用-exec {} +來完成完全相同的操作,但輸入時間較短。我們可以使用內聯shell進行構建,當運行更多的進程不那麼重要,然後看到結果。使用for構造,您最終可能會運行數千次grep,但您可以實時查看每個匹配項,而使用find和/或xargs可以看到批處理結果,但是grep運行時間要短得多。