2013-11-23 180 views
0

嗨,我是一個新手linux用戶。我試圖在bash中使用find命令來搜索給定的目錄,每個目錄包含多個具有相同名稱但具有不同內容的文件,以在文件中查找最大值。對bash中find命令的多個結果進行操作

起初,我沒有服用該目錄作爲輸入,並知道該文件將不低於2個目錄深,所以我是用嵌套循環如下:

prev_value=0 
for i in <directory_name> ; do 
    if [ -d "$i" ]; then 
    cd $i 
    for j in "$i"/* ; do 
     if [ -d "$j" ]; then 
     cd $j  
     curr_value=`grep "<keyword>" <filename>.txt | cut -c32-33` #gets value I'm comparing 
     if [ $curr_value -lt $prev_value ]; then 
      curr_value=$prev_value 
      else 
      prev_value=$curr_value 

     fi 
     fi 
    done 
    fi 
done  
echo $prev_value 

顯然這不會削減它現在。我查看了find的-exec選項,但是由於find產生了大量的結果,我只是不確定如何處理變量賦值和比較。任何幫助將不勝感激,謝謝。

回答

2
find "${DIRECTORY}" -name "${FILENAME}.txt" -print0 | xargs -0 -L 1 grep "${KEYWORD}" | cut -c32-33 | sort -nr | head -n1 

我們發現,被命名爲FILENAME.txtDIRECTORY下存在的文件名(FILENAME是一個bash變量)。

我們將它們全部打印出來,用空值分隔(這可以避免目錄或文件名中某些字符出現問題)。

然後我們看他們都在再次使用xargs,並通過空分隔(-0)值作爲參數grep,推出一個grep每個文件名(-L 1 - 讓我們的是POSIX兼容的在這裏)。 (我這樣做是爲了避免grep打印文件名,這會搞砸cut)。

然後我們sort所有的結果,數字(-n),降序(-r)。

最後,我們將第一行(head -n1)的排序數字 - 這將是最大的。

P.S.如果您有4個CPU內核,則可以嘗試將-P 4選項添加到xargs以嘗試使grep部分運行得更快。

+1

奇妙的是,我正在掃描手冊頁以獲得正確的標誌。提供管道的解釋(OP說他是新的!),並且你有我的真誠投票:) – slezica

+0

這真的很有幫助謝謝。但是我可能應該提到我需要解析的文件包含在多個目錄中。我不知道這是否有道理,但我基本上需要能夠按日期搜索,即/2013.04.07,/2012.*和/ *需要能夠工作,如果它們作爲參數傳遞 – user3025408

+1

Don'當你不需要它時使用'xargs'。這個更短更好:'find「$ DIRECTORY」-name「$ FILENAME.txt」-exec grep「$ KEYWORD」{} \;'。當'$ DIRECTORY'足夠時,爲什麼使用'$ {DIRECTORY}'風格更長的時間呢? – janos