一、find命令(搜索文件) 1、find命令的主要作用是對樹形目錄層次結構進行徹底檢查。
2、find命令的一般格式:
find pathname -expressions
二、find常用表達式 1、有三種表達式,選項表達式(不常用),條件表達式和操作表達式
-mount
選項表達式,用來防止find命令的搜索范圍超出當前文件系統的邊界。返回值常為真。
-group grp
條件表達式,檢查當前的文件是否具有與grp相同的GID或組名。如果兩者一致,返回真值,否則返回假值。
-name pattern
條件表達式,檢查文件名是否和模式pattern相同。pattern可以用正則表達式給出。必要時使用引號。當文件名與pattern一致時.返回真值.否則為假。
-type t
條件表達式,檢查當前文件的類型是否是t。對目錄講,t值可以是d。對普通文件講,t值可以是f,對連接講,t值可以是l等等。如果當前的文件的類型是t,返回真值,否則為假。
-user usr
條件表達式,檢查當前的文件的所有者或UID是否是usr。如果兩者一致,返回真值,否則為假。
-exec cmd
操作表達式,用來執行cmd命令。如果要將當前的文件名傳送給命令,應該加{}標記,分號用來表示cmd的結束,並和後面可能出現的表達式分開。如果成功地執行了cmd命令,返回真值,否則為假。
-print
操作表達式,將當前的文件名送到標准輸出設備顯示,返回值常為真。
-mtime -n +n #按文件更改時間來查找文件,-n指n天以內,+n指n天以前 -ctime -n +n #按文件創建時間來查找文件,-n指n天以內,+n指n天以前 同理: -mmin -n #n天以內更改時間
2、舉例 (1)/usr/lib # find . -name 'bin*' (等同於# find . -name 'bin*' -print)
./initramfs-tools/bin
./guile-1.8/bin
./firefox/distribution/searchplugins/locale/en-US/bing.xml
./firefox/distribution/searchplugins/locale/zh-CN/bing.xml
./firefox/distribution/searchplugins/locale/en-GB/bing.xml
./firefox/distribution/searchplugins/locale/en-ZA/bing.xml
./pm-utils/bin
./klibc/bin
./ure/lib/binaryurp.uno.so
./ure/bin
./thunderbird/distribution/searchplugins/locale/en-US/bing.xml
./python2.7/binhex.pyc
./python2.7/binhex.py
(2)# find . -name 'bin*' -type d -print (先通過文件名稱進行過濾,再通過文件類型進行過濾)
./initramfs-tools/bin
./guile-1.8/bin
./pm-utils/bin
./klibc/bin
./ure/bin
(3)# find . -name '*.bak' -type f -exec rm {} \; -print (-exec執行cmd命令,{}表示將當前文件作為傳送命令,\;表示rm的結束) 注意:{}後要“空格”並輸入"\;",否則出錯
下面打印出刪除的信息: ./test3.bak ./test.bak
./test2.bak
三、find邏輯表達式
邏輯表達式
描述
e1 -a e2
僅當e1為真時,對e2求值
e1 e2
同上
e1 -o e2
僅當e1為假時,對e2求值
e1,e2
對兩個表達式都求值,先e1,後e2
!e1
當e1為假時結果為真,反過來也一樣
(1)當前目錄下有a.bak b.bak # find . -name '*.bak' -type f -exec echo {} \; -print ./a.bak
./a.bak
./b.bak
./b.bak
四、find示例 1、查找當前目錄下的linux文件夾中包含有名為“a”文件中,存在”b“字符的行號 # find ./linux/ -name a | xargs grep -n "b" ./linux/a:1:aaabbb
./linux/test/a:1:aaabbb
2、其他 find . -user root -print find . -type f -mtime -4 –print (列出最近四天內修改過的文件)
find . -size +5000k -exec ls -lh {} \; (將大於5000k的文件打印出來)
find . \( -name "[Aa]*" -o -name "*[Aa]" \) -print (打印以Aa開頭或以Aa結尾的文件)
五、思考 1、統計在/etc/為起點的目錄樹中,包含字符串“telnet”,(不區分大小寫)的文件的數目。請寫出這條命令?
(1)方法一:用-exec 第一步: # find /etc/ -type f -exec grep -il "telnet" {} \;
/etc/bash_completion
/etc/bash_completion.d/qemu
/etc/services 第二步: # find /etc/ -type f -exec grep -il "telnet" {} \; | wc -l
3
(2)方法二:用管道 # find /etc/ -type f | grep -il "telnet"(錯誤,表示文件名稱是否包含telnet)
# find /etc/ -type f | xargs grep -il "telnet"
/etc/bash_completion
/etc/bash_completion.d/qemu
/etc/services
# find /etc/ -type f | xargs grep -il "telnet" | wc -l
3
2、文件中是否含有字符串? 可以用$ strings 命令