索引
基礎
exec執行命令
檔案名稱或尋找
忽略檔案
用find尋找以abc開頭,但不包含“.”的檔案的方法
find . -name "*.c" 在目前的目錄及其子目錄(用“.”表示)中尋找任何副檔名為“c”的檔案
find . -name "*Iden*" -exec rm {} \;
find ./ \( -iname "*.c" -or -iname "*.cc" \) 尋找以.c或.cc結尾的檔案 忽略大小寫
find -regex ".*\.\(xls\|csv\)" 尋找以xls 或csv 結尾的檔案
find -name "*.xls" -o -name "*.csv" 同上
find / -path /mnt -prune -o -regex ".*\.\(cc\|h\)"
find / \( -path /dev -o -path /var -o -path /mnt \) -prune -o -name "*.cc"|wc -l
用find尋找以abc開頭,但不包含“.”的檔案的方法
如下三種方法都可以:
1.
- find . -name "abc*" ! -name "*.*" -print
2.
- find . -regex '.*/abc[^.]*'
3.
- find . -name "*.*" -o -name "abc*" -print
第一種方法是最容易理解的了,第二個 -name前的 ! 號表示 -not, 與-not的意義是相同的,所以也可以寫成:
find . -name "abc*" -not -name "*.*" -print
第二種方法: 因為用-name選項的時候,find不支援Regex,此時要使用 -regex選項
正則式: '.*/abc[^.]*'
.*/ 表示在目前的目錄及下及目錄中找
[^.]* 表示abc後匹配任一字元,除了.
第三種方法看起來很難理解
因為-o 是 or 的意思,也就是或
猛的看起來好像是說找到所有含有. 或者以abc開頭的
其實不然
這兩個-name構成了這樣形式的運算式
Exp1 or Exp2
如果Exp1 為真的話,就不會再判斷Exp2
如果Exp1為假,才執行Exp2,非常類似於C語言中的 " || " 符號
所以,如果匹配到有.的檔案名稱,則不會執行後面的了,所以-print此時不會列印
今天也意外的發現了一點
find [path...] [expression]
在最後可以用 -exec command
如下:
find . -name "abc*" -exec ls {} /;
以前一直不明白後面加個 {} /;是幹什麼的
今天總算知道了
其實{} 表示匹配到前面的檔案
所以,你也可以這樣用:
find . -name "abc*" -exec mv {} {}.old /;
此時所完成的功能就是:
將所有以abc開關的檔案,全部在後面加上 .old 尾碼
2