1. 程式人生 > >find命令的幾個例子解析(-a,-o,-path,-wholename,-prune,-print)

find命令的幾個例子解析(-a,-o,-path,-wholename,-prune,-print)

一:find的基本模式和預設規則

find的基本模式是 find [path]  [express]    /*man find最上邊的命令格式 */

path可以省略,預設是當前目錄,

express又區分為options(選項)+tests(條件)+actions(動作),express可以邏輯複合

express中,選項先不介紹了,

test條件是的結果是真和假,可以省略的,若條件省略,則預設為true,ture則執行動作actions

actionf動作也是可以省略的,預設的action是-print,即做輸出

由上二條可以看也,整個express省略的話,就是執行-print,打印出所有目錄項(包括目錄和檔案)。

搞清楚了find的模式了,再來看命令就清楚多了 第一條命令: find -true -o -name -print          是複合的expression,分為二個子expression做邏輯或          前部分-true,只有test沒有action,預設是-print          由於是邏輯或,前邊為真,後部分 -name -print就可以省略不看了          這個命令相當於:find          即打出所有目錄項(目錄和檔案) 第二條: find -true -name -print          只是一個expression          -true -name 這個是二個條件,相當於-true -and -name  相當於 -name          -name 的完整格式是 -name pattern,後邊若不加檔案模式pattern,則pattern為null,目錄項(檔案和目錄)都是不可能為null,所以匹配失敗,test成false          這條命令相當於:find -name -print ,相當於find -false 第三條命令:find -true -a -print -a -name a -a -print            這條命令跟第一條命令差別關健在於,第一條命令是或操作,這條命令是與操作            或操作的話,前邊正確了,就不執行後邊的了,            與操作的話,相當於把-a前後的命令寫在一起,從左到右開始,遇到操作就執行操作,遇到test就在原來的條件基礎上再and新條件            看第三條命令: find -true -a -print -a -name a -a -print            這條命令等價於:find -true -print -name a  -print            從左到右開始:                    -true,是個test,此時條件為真(此時expression未結束,所以沒執行預設的-print)                    -print,是個action,輸出                     -name a,是個test,與前一個-true形成and : -true -and -name a,如果檔名為a即為true,否則false                     -print ,是個action,在當前test為true時執行              所以這條命令的結果是:a檔案打二次,其他檔案打一次 第四條命令: find -true -a -print -o -name a -a -print        這條命令注意命令的優先順序,在邏輯操作中,與操作憂先於或操作(與c語言同)          所以這條命令相當於: find -true -print -o -name a -print         -o,參考第一條第二條命令的處理,不再解釋 第五條命令,是man find裡的一個例子:  find . -wholename ’./src/emacs’ -prune -o -print 先提二點 -wholename 或者有 -path替代,gnu的find較新的版本中,這二個已經沒啥差別了 這條命令,用到了 -prune,  注意這裡 -prune 是個 action,而不是test 然後對這條find命令拆分 path為.,即當前目錄 expression為複合句,用-o拆分成二個子句,只有前一子句false時,才執行第二子句           第一個:-wholename ’./src/emacs’ -prune                  這裡test條件為:-wholename ’./src/emacs’,                       action為: -prune ,執行“挑過子目錄解析”,                     若test 結果為false,即沒匹配到./src/emacs, 是不執行action的,子句結果為false                     若test 結果為true,即匹配到  ./src/emacs ,則執行action:跳過                  綜合起來就是:當目錄項(檔案或目錄)匹配./src/emacs 時,執行prune,即“不進入該目錄”,或者說跳過該目錄解析,expression為true                                當目錄項(檔案或目錄)不匹配./src/emacs 時,expression為true           第二個:-print                  這個子句省略了test,預設即為true,-print是acion,即輸了                  在前一個語句的false的情況下才執行第二個語句, 所以整個複合的expression即,跳過目錄:./src/emacs 且不進入該目錄,輸出其他目錄項