Shell
評估查找 ( -exec )
我正在搜尋包含一組字元串之一的所有文件。如果他們這樣做,我會更改他們的訪問權限。
find . -type f -exec grep -q '#!/bin/bash\|#!/usr/bin/grep\|#!/usr/bin/awk' {} \; -exec chmod 700 {} ;\
我很好奇 find 當它找到包含該字元串的文件時它是如何工作的,
grep -q
所以0
另一個 exec 執行但不應該執行。第二個exec
查找所有文件並更改所有文件的權限。為什麼它起作用並且只更改那些包含該字元串的文件?
我不確定你的意圖是什麼(你沒有說清楚),但如果是 chmod 到 700 匹配模式的所有文件,那麼,除了你的錯字(
;\
而不是\;
),你的命令似乎工作故意的。然而:
當它找到包含該字元串的文件時,
grep -q
我0
會執行另一個 exec 但不應該執行。是的,它應該這樣做。0 表示成功表示為真,因此
find
繼續評估其表達式,第二次-exec
執行。1(或 0 以外的任何值)將意味著失敗將意味著錯誤,因此find
會短路其評估(並列表達式之間存在隱含的邏輯與),因此第二個-exec
不會執行。為什麼它有效
檢查 GNU 的聯機幫助頁
find
:expr1 expr2
連續的兩個表達式被認為是用隱含的“and”連接的;如果expr1為假,則不計算expr2 。