[英]Bash - find exec return value
我需要一種方法來判斷grep是否確實找到了什么,並且理想地將該返回值傳遞給if語句。
假設我有一個tmp
文件夾(當前文件夾),因為有幾個文件和子文件夾。 我想搜索名為abc
所有文件以獲取模式xyz
。 搜索被認為是成功的,如果它發現任何發生xyz
(不要緊多少次xyz
被發現)。 如果未找到xyz
則搜索失敗。
在bash中,它可以像這樣完成:
find . -name "abc" -exec grep "xyz" {} \;
這將顯示是否找到了xyz
。 但我不確定如何將結果(成功與否)傳回if
語句。
任何幫助,將不勝感激。
你可以試試
x=`find . -name abc | xargs grep xyz`
echo $x
也就是說,x包含您的返回值。 沒有匹配時它是空白的。
如果你想知道find
找到一些文件abc
並且其中至少有一個包含字符串xyz
,那么你可以使用:
if find . -name 'abc' -type f -exec grep -q xyz {} +
then : All invocations of grep found at least one xyz and nothing else failed
else : One or more invocations of grep failed to find xyz or something else failed
fi
這依賴於find
為其自己的操作返回退出狀態,以及它執行的任何命令的非零退出狀態。 最后的+
將與find
一樣多的文件名組合成一個命令行。 你需要很多文件名(大量相當長的名字)才能使find
run grep
多次。 在運行Mac OS X 10.10.4的Mac上,我得到了大約3,000個文件,每個文件名稱大約有32個字符,參數列表只有100多個KiB,沒有grep
多次運行。 OTOH,當我有不到8000個文件時,我得到兩次grep
運行,每個參數列表大約130 KiB。
有人簡要地留下了一條評論,詢問是否保證了find
的退出狀態。 答案是肯定的 - 雖然我不得不稍微修改一下退出狀態的描述。 在-exec
的描述下,POSIX指定:
如果[實用程序'的任何調用(例如此問題中的
grep
)返回非零值作為退出狀態,則find
實用程序將返回非零退出狀態。
在一般的“退出狀態”下,它說:
應返回以下退出值:
0
- 已成功遍歷所有路徑操作數。
>0
- 發生錯誤。
因此,只要沒有自己的操作失敗並且只要它調用的grep
命令都沒有失敗, find
就會報告成功。 找到零文件,但沒有失敗將被報告為成功。 (例如,失敗可能缺乏搜索目錄的權限。)
find返回-exec
命令的結果作為結果,只需將命令放在if語句中:
if [[ -n $(find . -name "abc" -exec grep "xyz" {} \;) ]]
then
# do something
fi
可以為grep
命令指定一個“靜音”其輸出的-q
選項。 Grep將根據您是否在您指向的文件中找到任何內容來返回成功或失敗。
如果你的shell能夠使用它,而不是試圖解析find
命令的輸出,你可能想嘗試使用for
循環。 例如在bash中:
shopt -s globstar
cd /some/directory
for file in **/abc; do
grep -q "xyz" "$file" && echo "Found something in $file"
done
這是你在找什么?
您應該能夠只使用grep做到這一點--include
我相信。
像這樣:
if grep -r --include=abc -q xyz; then
: Found at least one match
else
: No matching lines found
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.