Bash

在 while 循環中通過特定搜尋查找文件

  • July 20, 2018

實際上,這與我之前的文章有關,通過搜尋某些文件副檔名來整理目錄,但仍未得到答复。有很多選項可以解決這個問題,但我對while循環特別感興趣。在目前工作目錄中,我想通過循環掃描某些內容來搜尋特定文件的存在,while然後只列印相應的文件夾名稱。目前工作目錄有許多文件夾和子文件夾。這是我的腳本:

while IFS= read -r d; do  
  if [[ "$d"=="*.out" && grep "index123"]]; then exit 1;  fi  
done <<  (find . -prune -type d) 

我不知道強加是否if是在循環內做的正確方法或其他方法。請指導。

為什麼grep失敗

在終端中執行此操作:

失敗 - 等待輸入

$ grep "index123"

Works - 從 STDIN 接收輸入

$ echo -e "line1\nline2\nindex123blah\n" | grep "index123"
index123blah

第二個之所以有效,是因為我們提供了輸入grep以通過 STDIN 進行解析。grep將從 STDIN 或文件中獲取輸入。在您的場景中:

if [[ "$d"=="*.out" && grep "index123"]]; then exit 1;  fi  

它也沒有解析,因此它失敗了。

你的問題

從您的程式碼的外觀來看,我相信您想要這樣的東西。首先是一些範例數據:

$ mkdir -p 1/2/{3..5}
$ echo "index123" > 1/2/3/blah.out
$ echo "index123" > 1/2/3/blip.out
$ echo "index" > 1/2/blip.out
$ echo "index" > 1/2/blah.out

以及腳本的修改形式:

$ cat loopy.bash
#!/bin/bash

while IFS= read -r d; do  
 grep -l "index123" "$d" && exit 1
done < <(find . -type f -name "*.out") 

跑步:

$ ./loopy.bash
./1/2/3/blah.out

發出它找到的第一個具有index123字元串的文件,然後退出。

雖然循環一個好的解決方案?

我不會這樣做。以這種方式在這裡使用while循環是不必要的。find .... | xargs ...使用架構或解決方案類型會更好find ... -exec

請參閱@DopeGhoti 的答案find,了解使用-execor的更好方法xargs

列印包含目錄

如果您只是想列印匹配文件所在的包含目錄樹,您可以使用dirname如下方式執行此操作:

$ cat loopy2.bash
#!/bin/bash

while IFS= read -r d; do
  grep -q "index123" "$d" && dirname "$d"  && exit 1
done < <(find . -type f -name "*.out")

並執行它:

$ ./loopy2.bash
./1/2/3

引用自:https://unix.stackexchange.com/questions/457284