簡體   English   中英

Bash - 找到exec返回值

[英]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.

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