語法
find [選項] [path...]
選項
選項 | 含義 |
---|---|
-help或--help | 在線幫助 |
-name <pattern> |
用shell模式 <pattern> 匹配文件名。 <pattern> 可以用引號括起來,也可以不用,但是最好是用引號括起來。 |
-iname <pattern> |
效果與-name類似,但忽略字符大小寫 |
-ls | 列出文件或目錄名稱列表到標准輸出 |
-exec command ; |
執行指令,詳細用法請看下文的-exec command ; 用法說明 |
-type <c> |
只尋找符合指定的文件類型的文件, c這里是一個字符 |
-prune | 如果文件是一個目錄,就不會進入此目錄 |
-regex <pattern> |
用正則表達式匹配文件名,這只是匹配文件的全路徑,不是文件內容。 |
-regextype <type> |
更改在命令行中稍后出現的-regex和-iregex測試所理解的正則表達式語法。 當前實現的 <type> 是emacs(這是默認的),posix - awk,posix - basic,posix - UNK p和posix - extended。 |
將文件或目錄名稱列出到標准輸出。格式為每列一個名稱,每個名稱前皆有"./"字符串 |
示例
列出當前目錄及子目錄下所有文件和文件夾
find .
在當前目錄下查找.java文件
find . -name "*.java"
當前目錄及子目錄下查找所有.java和.cpp文件
find . -name "*.java" -o -name "*.cpp"
find . \( -name "*.java" -o -name "*.cpp" \)
或者使用正則表達式
find . | egrep ".*(\.java|\.cpp)$"
find . -regextype "posix-egrep" -regex ".*(\.java|\.cpp)$"
找出當前目錄下不是以.cpp結尾的文件
find . ! -name "*.cpp"
根據文件類型搜索
find . -type <類型參數>
類型參數 | 含義 |
---|---|
f | 普通文件 |
l | 符號鏈接 |
d | 目錄 |
c | 字符設備 |
b | 塊設備 |
s | 套接字 |
p | 管道FIFO |
刪除匹配文件
find . -type f -name "*.class" -delete
查找當前目錄下所有的.java文件,但是跳過子目錄chapter02
find . -path "./src/com/fireway/util" -prune -o -name "*.java" -print
-exec command ;
的用法說明
-exec
選項后面跟隨着所要執行的命令或腳本,然后是一對大括號{}
,一個空格,一個反斜杠\
加上一個分號。因為分號;
在bash的環境下是有特殊意義的,因此利用反斜線來跳脫。
{}
花括號代表前面find查找出來的文件名
示例,顯示
find . -exec ls -l {} \;
示例,刪除
find . -exec rm -rf {} \;
示例,把當前所有的Android.mk文件重命名為Android.mk_bak
find . -name "Android.mk" -exec mv {} {}_bak \;
但是有一點不好的是只能在后面加個后綴。
示例,如果遇到想把后綴.class修改成.clazz,可以考慮寫一個shell腳本。
for file in $(find . -name "*.class" -type f); do mv ${file} ${file/.class/.clazz}; done
具體的shell變量怎么替換的可以參考《shell變量詳解》來搞定,這里就不再細寫了。
find結合xargs使用
注意xargs這里是一個單獨的命令,不是find里面的一個選項。