1. 程式人生 > >每天一個linux命令:find

每天一個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指定對符號連線的處理方式

[[email protected] dir1]# ln -s /bin  rootbin
[[email protected] dir1]# find -P . -name pwd
[[email protected] dir1]# find -L . -name pwd
./rootbin/pwd
[[email protected] dir1]# find -H rootbin  . -name pwd
rootbin/pwd

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

列出當前目錄及子目錄下所有檔案和資料夾

[[email protected] alertscripts]# find
.
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

在當前目錄下查詢以.py結尾的檔名

[[email protected] alertscripts]# find . -name "*.py"
./sendim.py
./sendmail.py
./sendwechat.py

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

[[email protected] alertscripts]# find . -iname "*.PY"
./sendim.py
./sendmail.py
./sendwechat.py

當前目錄及子目錄下查詢所有以.py和.sh結尾的檔案

[[email protected] alertscripts]#  find . -name "*.py" -o -name "*.sh"
./sendim.py
./sendmail.py
./sendsms.sh
./sendwechat.py

找出當前目錄下不是以.sh結尾的檔案

[[email protected] alertscripts]# find . ! -name "*.sh"
.
./sendim.py
./sendmail.py
./sendwechat.py

示例3:匹配檔案路徑或者檔案

find /usr/ -path "*local*"

示例4:基於正則表示式匹配檔案路徑

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

同上,但忽略大小寫

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

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

查詢當前目錄或者子目錄下所有檔案,但是跳過子目錄alertscripts

[[email protected] 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 )

[[email protected] alertscripts]# find . -type d
.

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

[[email protected] 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檔案並刪除

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

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可以使使用者對所匹配到的檔案執行幾乎所有的命令。

相關推薦

每天一個linux命令:find

1、命令簡介         find(find) 命令用來在指定目錄下查詢檔案。任何位於引數之前的字串都將被視為欲查詢的目錄名。如果使用該命令時,不設定任何引數,則find命令將在當前目錄下查詢子目錄與檔案。並且將查詢到的子目錄和檔案全部進行顯示。 2、用法 3、選項 '-H'表示只

每天一個linux命令——find

find:查詢指定目錄下的文件 語法: find 路徑 [ 選項 ] [ 引數 ] 常見選項: -type:搜尋的文件型別,f是檔案,d是目錄,l是連結,c是字元裝置,b是塊裝置,s套接字,p是FIFO -i:忽略大小寫 -name:檔案的名稱,可以用萬用字元 -maxde

每天一個linux命令(文件操作):【轉載】find命令之xargs

溢出 系統性能 問題 ameba pri 幾分鐘 body 只有一個 獲取參數   在使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之

每天一個linux命令(19):find 命令概覽

PE 根據 根目錄 配置 它的 UC sta deploy sort Linux下find命令在目錄結構中搜索文件,並執行指定的操作。Linux下find命令提供了相當多的查找條件,功能很強大。由於find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來

每天一個linux命令(20):常用檔案搜尋命令locate/find/which/whereis

004.檔案搜尋命令         04-01.檔案搜尋命令locate             a.locate 功能單一,只搜尋檔名; &nbs

每天一個linux命令(22):find 命令的引數詳解

find一些常用引數的一些常用例項和一些具體用法和注意事項。 1.使用name選項: 檔名選項是find命令最常用的選項,要麼單獨使用該選項,要麼和其他選項一起使用。 可以使用某種檔名模式來匹配檔案,記住要用引號將檔名模式引起來。 不管當前路徑是什麼,如

每天一個linux命令(19)--find(exec)

find是我們很常用的一個Linux命令,但是我們一般查找出來的並不僅僅是看看而已,還會有進一步的操作,這個時候exec的作用就顯現出來了。  exec解釋: -exec  引數後面跟的是command命令,它的終止是以;為結束標誌的,所以這句命令後面的分號是不可缺少

每天一個Linux命令】15. 搜尋檔案命令find

命令用途 find命令用於:在一個目錄(及子目錄)中搜索檔案,你可以指定一些匹配條件,如按檔名、檔案型別、使用者甚至是時間戳查詢檔案。命令例項 0. 幫助命令: [email protected]:~$ find -help 用法: find [-H] [-L]

每天一個linux命令8之grep高級篇

表達式 大寫 world exp 大寫字母 重復數 tools href 反向 1語法 grep -[acinv] ‘搜索內容串‘ filename-a 以文本文件方式搜索-c 計算找到的符合行的次數-i 忽略大小寫-n 順便輸出行號-v 反向選擇,即找 沒有搜索

每天一個linux命令(16):tail命令

nvi 系統 strong 維基百科 ron .com linux tro 聯系 版權聲明更新:2017-05-20博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 本文介紹了Linu

每天一個linux命令(11):cat命令

部分 ron linu mv命令 平臺 linux下 一個 介紹 inux 版權聲明更新:2017-05-15博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 本文介紹了Linux下面

每天一個linux命令(9):cp命令

系統 lin 維基 介紹 參考 vip 聲明 com 開發平臺 版權聲明更新:2017-05-13博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 本文介紹了Linux下面的cp命令。

【轉載】每天一個Linux命令

mkdir 命令 結構 oca archive mic post rmdir 命令 每天 sof 每天一個linux命令(1) : ls 命令 每天一個linux命令(2) : cd 命令 每天一個linux命令(3) : pwd 命令 每天一個linux命令(4)

每天一個Linux命令001——ls

簡單 relink rect sql 目錄 print logs apach 我只 聯想記憶: ls - list directory 語法:   ls [OPTION]... [FILE]...   說明:ls是命令,OPTION是選項例如-a、-l,FIL

每天一個linux命令

文件和目錄屬性 vmstat命令 find命令 性能 參考 url http 目錄 standard 開始詳細系統的學習linux常用命令,堅持每天一個命令,所以這個系列為每天一個linux命令。學習的主要參考資料為:   1.《鳥哥的linux私房菜》   2.http:

每天一個linux命令(4):mkdir命令

指定位置 cnblogs 同名 parent --help pos uri 不存在 必須 linux mkdir 命令用來創建指定的名稱的目錄,要求創建目錄的用戶在當前目錄中具有寫權限,並且指定的目錄名不能是當前目錄中已有的目錄。 1.命令格式: mkdir [選

每天一個linux命令(5):rm 命令

每天 幫助信息 rbo 總計 com 刪除 強行 高度 linux中 昨天學習了創建文件和目錄的命令mkdir ,今天學習一下linux中刪除文件和目錄的命令: rm命令。rm是常用的命令,該命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文

每天一個linux命令(13):less 命令

文件中 參數 使用 ech height 查看進程 str idt 目錄 less 工具也是對文件或其它輸出進行分頁顯示的工具,應該說是linux正統查看文件內容的工具,功能極其強大。less 的用法比起 more 更加的有彈性。在 more 的時候,我們並沒有辦法向前面翻

每天一個linux命令(18):locate 命令

一次 clu ado 模式 pda -o gic style art locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。其方法是先建立一個包括系統內所有檔案名稱及路徑的數據庫,之後當尋找時就只需查詢這個數據庫,而不必實際深入檔案系統之中了。在一般的 dis

每天一個linux命令(1):scp 命令

filename use des 本地文件 lin oca www tro 服務器 scp命令主要用於兩個服務器之間文件的傳輸。 1、從服務器下載文件 scp [email protected]:/path/filename /tmp/local_destin