[英]linux find on multiple patterns
我需要對大約1500個文件名進行查找,並且想知道是否有辦法同時執行同步查找命令。
現在我做的事情就像
for fil in $(cat my_file)
do
find . -name $fil >> outputfile
done
有沒有辦法產生多個find實例來加速這個過程。 現在,一次運行一個文件大約需要7個小時。
鑒於您提到的7小時運行時,我假設文件系統中有數百萬個文件,因此在下一個查詢開始之前,一個查詢中加載的OS磁盤緩沖區將被重用。 您可以通過對相同的find
計時幾次來測試此假設,如下例所示。
tini ~ > time find . -name IMG_0772.JPG -ls
25430459 9504 lrwxrwxrwx 1 omg omg 9732338 Aug 1 01:33 ./pix/rainbow/IMG_0772.JPG
20341373 5024 -rwxr-xr-x 1 omg omg 5144339 Apr 22 2009 ./pc/2009-04/IMG_0772.JPG
22678808 2848 -rwxr-xr-x 1 omg omg 2916237 Jul 21 21:03 ./pc/2012-07/IMG_0772.JPG
real 0m15.823s
user 0m0.908s
sys 0m1.608s
tini ~ > time find . -name IMG_0772.JPG -ls
25430459 9504 lrwxrwxrwx 1 omg omg 9732338 Aug 1 01:33 ./pix/rainbow/IMG_0772.JPG
20341373 5024 -rwxr-xr-x 1 omg omg 5144339 Apr 22 2009 ./pc/2009-04/IMG_0772.JPG
22678808 2848 -rwxr-xr-x 1 omg omg 2916237 Jul 21 21:03 ./pc/2012-07/IMG_0772.JPG
real 0m0.715s
user 0m0.340s
sys 0m0.368s
在該示例中,第二個find
運行得更快,因為操作系統仍然在第一個find
RAM中有緩沖區。 [在我的小型Linux 3.2.0-32系統上,根據目前top
的2.5GB RAM是緩沖區,0.3GB是免費的,使用3.8GB(即程序和操作系統大約1.3GB)。
無論如何,為了加快處理速度,你需要找到一種方法來更好地利用操作系統磁盤緩沖。 例如,將系統內存增加一倍或四倍。 或者,嘗試使用locate
命令。 查詢
time locate IMG_0772.JPG
在我的系統上持續不到一秒鍾。 您可能希望在啟動找到1500個文件名的作業之前運行updatedb
。 見man updatedb
。 如果目錄.
在你的find
只提供整個文件系統的一小部分,因此locate
數據庫包含許多不相關的文件,在運行updatedb
時使用各種prune
選項,以最小化運行locate
時訪問的locate
數據庫的大小; 然后,運行plain updatedb
將其他文件名恢復到locate
數據庫。 使用locate
你可能會將運行時間減少到20分鍾。
此解決方案只調用find
和fgrep
一次:
find . | fgrep -f my_file > outputfile
我假設my_file
有一個你要查找的文件列表,每個名字都在一個單獨的行上。
find
命令查找當前目錄中的所有文件(包括目錄)。 它的輸出是一個文件/目錄列表,每行一個 fgrep
命令從find命令的輸出中搜索,但不是在命令行上指定搜索項,而是從my_file
獲取搜索項 - 這是-f
標志的內容。 outputfile
有沒有辦法產生多個find實例來加速這個過程。
這不是您想要解決問題的方式,因為find
是I / O和FS限制的。
使用與-o
組合在一起的多個-name
參數,以便使用一個find
命令一次find
多個文件名,或者查找所有文件一次並使用諸如grep
的工具來搜索文件的結果列表以查找感興趣的文件名。
也許是這樣的
find . \( -name file1 -o -name file2 -o ... \) >outputfile
您可以構建此類行,具體取決於my_file
的名稱數量:
find . \( $(xargs <my_file printf "-name %s -o " | sed 's/-o $//') \) >outputfile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.