Bash
在 while 循環中通過特定搜尋查找文件
實際上,這與我之前的文章有關,通過搜尋某些文件副檔名來整理目錄,但仍未得到答复。有很多選項可以解決這個問題,但我對
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
,了解使用-exec
or的更好方法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