每天一個linux命令:find


1、命令簡介

        find(find) 命令用來在指定目錄下查找文件。任何位於參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。

2、用法

image

3、選項

'-H'表示只跟隨命令行中指定的符號連接,
'-L'表示跟隨所有的符號連接,
'-P'是默認的選項,表示不跟隨符號連接。
-D debugoptions. 打印診斷信息
-Olevel  Enables  query  optimisation.   允許查詢優化

EXPRESSIONS:表達式可能由下列成份組成:操作符、選項、測試表達式以及動作:

1、操作符為and、or、!的組合。

! expr True if expr is false.        
-not expr   Same as ! expr, but not POSIX compliant.
expr1 expr2  implied "and"; expr2 is not evaluated if expr1 is false.
expr1 -a expr2  Same as expr1 expr2.
expr1 -and expr2 Same as expr1 expr2, but not POSIX compliant.
expr1 -o expr2  Or; expr2 is not evaluated if expr1 is true.
expr1 -or expr2  Same as expr1 -o expr2, but not POSIX compliant.
expr1 , expr2 List; both expr1 and expr2 are always evaluated.  The  value  of expr1 is discarded; the value of the list is the value of expr2.The comma operator can be useful for searching for several  different  types  of thing, but traversing the filesystem hierarchy only once.  The -fprintf action can be used to list the  various matched items into several different output files.

2、設置項針對這次查找任務,而不是僅僅針對某一個文件,設置項總是返回true;

位置選項 (總是真): -daystart -follow -regextype
普通選項 (總是真,在其它表達式前指定):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race

3、測試項(test)則不同,它針對具體的一個文件進行匹配測試,如-name,-user等,返回true或者false;

測試項

-name  -type  -ok  -newer -perm  -atime, -ctime, -depth, -group,  -links,  -mtime,-nogroup,  -nouser,  -print,  -prune,  -size,  -user  and  -xdev -atime,  -ctime,  -depth,  -group,  -links,  -mtime,-nogroup,  -nouser,  -perm,  -print,  -prune, -size,-user and –xdev

測試項說明

-name   filename             #查找名為filename的文件
-perm                        #按執行權限來查找
-user    username             #按文件屬主來查找
-group groupname            #按組來查找
-mtime   -n +n                #按文件更改時間來查找文件,-n指n天以內,+n指n天以前
-atime    -n +n               #按文件訪問時間來查GIN: 0px">
-ctime    -n +n              #按文件創建時間來查找文件,-n指n天以內,+n指n天以前
-nogroup                     #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                     #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以內,+n指n天以前 
-ctime    -n +n               #按文件創建時間來查找文件,-n指n天以內,+n指n天以前 
-nogroup                     #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                      #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2               #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size      n[c]               #查長度為n塊[或n字節]的文件
-depth                       #使查找在進入子目錄前先行查找完本目錄
-fstype                     #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size      n[c]               #查長度為n塊[或n字節]的文件
-depth                       #使查找在進入子目錄前先行查找完本目錄
-fstype                      #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount                       #查文件時不跨越文件系統mount點
-follow                      #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio                %;      #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount                       #查文件時不跨越文件系統mount點
-follow                      #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio                        #對匹配的文件使用cpio命令,將他們備份到磁帶設備中
-prune                       #忽略某個目錄

4、動作項(action)則是對某一個文件進行某種動作(最常見的如-print)

actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune – -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
  1. -print: find命令將匹配的文件輸出到標准輸出。
  2. -ls:使用ls -dils 格式將匹配的文件輸出到標准輸出。
  3. -exec: find命令對匹配的文件執行該參數所給出的shell命令。
  4. -ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

4、示例

實例1:-H –L –P指定對符號連接的處理方式

[root@oracledb dir1]# ln -s /bin  rootbin
[root@oracledb dir1]# find -P . -name pwd
[root@oracledb dir1]# find -L . -name pwd
./rootbin/pwd
[root@oracledb dir1]# find -H rootbin  . -name pwd
rootbin/pwd

示例2:根據文件名或者正則表達式進行匹配

列出當前目錄及子目錄下所有文件和文件夾

[root@zabbix alertscripts]# find
.
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

在當前目錄下查找以.py結尾的文件名

[root@zabbix alertscripts]# find . -name "*.py"
./sendim.py
./sendmail.py
./sendwechat.py

在當前目錄下查找以.py結尾的文件名 ,但忽略大小寫

[root@zabbix alertscripts]# find . -iname "*.PY"
./sendim.py
./sendmail.py
./sendwechat.py

當前目錄及子目錄下查找所有以.py和.sh結尾的文件

[root@zabbix alertscripts]#  find . -name "*.py" -o -name "*.sh"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

找出當前目錄下不是以.sh結尾的文件

[root@zabbix alertscripts]# find . ! -name "*.sh"
.
./sendim.py
./sendmail.py
./sendwechat.py

示例3:匹配文件路徑或者文件

find /usr/ -path "*local*"

示例4:基於正則表達式匹配文件路徑

[root@zabbix alertscripts]#  find . -regex ".*\(\.sh\|\.py\)$"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

同上,但忽略大小寫

[root@zabbix alertscripts]#  find . -iregex ".*\(\.SH\|\.PY\)$"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

示例5:搜索但跳出指定的目錄

查找當前目錄或者子目錄下所有文件,但是跳過子目錄alertscripts

[root@zabbix zabbix]# find .  -path "./alertscripts" -prune  -o -name "*.*"
.
./web/maintenance.inc.php
./web/zabbix.conf.php
./zabbix_java_gateway.conf
./zabbix_agentd.d
./zabbix_agentd.d/userparameter_mysql.conf
./zabbix_agentd.conf
./alertscripts
./zabbix_java_gateway_logback.xml
./zabbix_server.conf.rpmnew_bak
./zabbix_server.conf_bak
./zabbix_server.conf

示例6:根據文件類型進行搜索

(f 普通文件 l 符號連接 d 目錄 c 字符設備 b 塊設備 s 套接字 p Fifo )

[root@zabbix alertscripts]# find . -type d
.

示例7:基於目錄深度搜索 向下最大深度限制為1

[root@zabbix zabbix]# find . -maxdepth 1
.
./web
./zabbix_java_gateway.conf
./zabbix_agentd.d
./zabbix_agentd.conf
./alertscripts
./zabbix_java_gateway_logback.xml
./zabbix_server.conf.rpmnew_bak
./zabbix_server.conf_bak
./zabbix_server.conf

搜索出深度距離當前目錄至少2個子目錄的所有文件

find . -mindepth 2 

示例8:根據文件時間戳進行搜索

find . -type f 時間戳

UNIX/Linux文件系統每個文件都有三種時間戳:

訪問時間(-atime/天,-amin/分鍾):用戶最近一次訪問時間。

修改時間(-mtime/天,-mmin/分鍾):文件最后一次修改時間。

變化時間(-ctime/天,-cmin/分鍾):文件數據元(例如權限等)最后一次修改時間。

搜索最近七天內被訪問過的所有文件

find . -type f -atime –7

搜索恰好在七天前被訪問過的所有文件

find . -type f -atime 7

搜索超過七天內被訪問過的所有文件

find . -type f -atime +7

搜索訪問時間超過10分鍾的所有文件

find . -type f -amin +10

找出比file.log修改時間更長的所有文件

find . -type f -newer file.log

示例9:根據文件大小進行匹配 

搜索大於10KB的文件

find . -type f -size +10k

搜索小於10KB的文件

find . -type f -size –10k

搜索等於10KB的文件

find . -type f -size 10k

示例10:根據文件權限/所有權進行匹配

當前目錄下搜索出權限為777的文件

find . -type f -perm 777

找出當前目錄下權限不是644的php文件

find . -type f -name "*.php" ! -perm 644

示例11:根據用戶/用戶組進行匹配

找出當前目錄用戶zabbix擁有的所有文件

find . -type f -user zabbix

找出當前目錄用戶組zabbix擁有的所有文件

find . -type f -group zabbix

示例12:–delete 刪除匹配文件

刪除當前目錄下所有.txt文件

find . -type f -name "*.txt" –delete

示例13:列出匹配文件 :

find . -type f -name "*.txt" –ls

5、借助-exec選項與其他命令結合使用

find是我們很常用的一個Linux命令,但是我們一般查找出來的並不僅僅是看看而已,還會有進一步的操作,這個時候exec的作用就顯現出來了。exec選項后面跟隨着所要執行的命令或腳本,然后是一對兒{ },一個空格和一個\,最后是一個分號。

-exec  參數后面跟的是command命令,它的終止是以;為結束標志的,所以這句命令后面的分號是不可缺少的,考慮到各個系統中分號會有不同的意義,所以前面加反斜杠。{}   花括號代表前面find查找出來的文件名。

找出當前目錄下所有root的文件,並把所有權更改為用戶oracle

find .-type f -user root -exec chown oracle {} \;

查找當前目錄下所有.txt文件並把他們拼接起來寫入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt

將30天前的.log文件移動到old目錄中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出當前目錄下所有.txt文件並以“File:文件名”的形式打印出來

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

因為單行命令中-exec參數中無法使用多個命令,以下方法可以實現在-exec之后接受多條命令

-exec ./text.sh {} \;

6、find的ok操作

-ok和-exec行為一樣,不過它會給出提示,讓用戶決定是否執行相應的操作。

找出自己家目錄下所有的.txt文件並刪除

[root@oracledb ~]# find $HOME/. -name "*.txt" -ok rm -f {} \;
< rm ... /root/./log1.txt > ? y
< rm ... /root/./study/dir2/test.txt > ? y
< rm ... /root/./log.txt > ? y
[root@oracledb ~]#

7、find與xargs

在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,並如此繼續下去

在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。

來看看xargs命令是如何同find命令一起使用的,並給出一些例子。

查找系統中的每一個普通文件,然后使用xargs命令來測試它們分別屬於哪類文件

find . -type f -print | xargs file

在整個系統中查找內存信息轉儲文件(core dump) ,然后把結果保存到/tmp/core.log 文件中:

find / -name "core" -print | xargs echo "" >/tmp/core.log

用grep命令在所有的普通文件中搜索hostname這個詞

find . -type f -print | xargs grep "hostname"

刪除3天以前的所有東西

find . -ctime +3 -exec rm -rf {} \;
find ./ -mtime +3 -print|xargs rm -f –r

刪除文件大小為零的文件

find ./ -size 0 | xargs rm -f &

find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM