簡體   English   中英

linux找到多種模式

[英]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分鍾。

此解決方案只調用findfgrep一次:

find . | fgrep -f my_file > outputfile

我假設my_file有一個你要查找的文件列表,每個名字都在一個單獨的行上。

說明

  1. find命令查找當前目錄中的所有文件(包括目錄)。 它的輸出是一個文件/目錄列表,每行一個
  2. fgrep命令從find命令的輸出中搜索,但不是在命令行上指定搜索項,而是從my_file獲取搜索項 - 這是-f標志的內容。
  3. fgrep命令的輸出(您要查找的文件列表)將重定向到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM