shell中find命令的使用要點


linux中的find的命令查找文件的重要方式,輔以其他的bash命令可以實現強大的操作效果。

先看看放find命令的基本組成:

find pathname -option [-print -exec -ok ...]

分類記憶各項屬性參數~

  pathname:指定find命令的查詢根路徑,例如 ‘ / ’,‘./ ' 等。

          同時還可在-path參數中指定搜索路徑。

  -option:

   1、文件操作:

         -name 用引號” “將查詢的文件名括起來,可適用於簡單的正則表達式(應改為shell的元字符,下同)。

         -type   指定查找文件的類型

              b - 塊設備文件。
              d - 目錄。
              c - 字符設備文件。
              p - 管道文件。
              l - 符號鏈接文件。
              f - 普通文件。  

         -size n 指定文件大小,若數字前+表示大於,-表示小於;常用單位c(字節),k(KB),M(MB)

   2、用戶權限:

         -perm 用戶權限permission,用常用的三位數字,如644表示權限。若數字前+表示至少包括指定的一種訪問權限,-表示必須包括指定的所有訪問權限

         -user / -nouser  按文件屬主查詢 / 查找無有效屬主的文件

         -group / -nogroup 按文件所屬租來查 / 查找無有效所屬租的文件 

   3、時間選項:

         -atime / -amin n  最近訪問(accessed)過的文件,前者表示單位是天(24h),后者單位是分鍾(minute);若數字前+表示n段時間前,-表示最近n段時間。后同。

         -ctime / -cmin n 最近狀態改變(changed)過的文件    

         -mtime / -mmin n 最近內容修改(modified)過的文件 

         -newer file!otherfile  查找更改時間比file新的文件,加上非(!)則查找比otherfile舊的文件    

(注意,邏輯符號包括!(not)、-a(and)、-o(or),在命令中都是短路求值,簡單講就是若后面的參數不影響邏輯判斷,則不對后面求值。在find命令中一般在選項之前添加邏輯符號)

      4、文件路徑:

         -follow 遇到符號鏈接文件,就跟蹤到鏈接指向的文件

         -mount 不跨越文件系統的mount點,即在當前的文件系統查詢,不進入其他文件系統(如掛載的windows系統)

         -path 給出文件路徑,可在路徑中查詢,滿足簡單正則表達式(元字符)。例如查找當前路徑中' ./var/www '子目錄中的’ index.html ’ 文件:

$ find . -path './var/www*' -name 'index.html' -print
./var/www/learn/study_smarty/templates/index.tpl ./var/www/learn/study_smarty/docs/index.php ./var/www/learn/index.php ./var/www/index.html

(結果中可以看到,-path選項中的參數要為模糊的查詢條件,我理解的-path選項查找出的文件名實際上是帶路徑的字符串,而-path中則是滿足結果字符串中的前面的路徑字符。)

         -prune 指出要忽略的目錄。 結合-path選項,例如在當前目錄下查找‘ index.html ’文件,同時忽略路徑下的‘ /www/bin ’目錄:

$ find . -path './www/bin' -prune -o -name 'index.html' -print

-path “./www/bin” -prune -o -name 'index.html' -print 是 -path “./www/bin” -a -prune -o -name 'index.html' -print 的簡寫表達式。按順序求值,-a 和 -o 都是短路求值,與 shell 的 && 和 || 類似如果 -path “./www/bin” 為真,則求值 -prune , -prune 返回真,“與”邏輯表達式為真;否則不求值 -prune,與邏輯表達式為假。如果 -path “/usr/sam” -a -prune 為假,則求值 -name。-name返回真,“或”邏輯表達式為真;否則不求值 -name,“或”邏輯表達式為真。

(因此,其他的查詢條件必須放在-o之后!而-path選項一般放在最前,-prune和-o也要連用)

避開多個文件可以用:

$ find /usr  \(-path /usr/dir1 -o -path /usr/dir2 \) -prune -o -name "index.html" -print

‘ \(’  與 ‘ \) ’ 表示轉義,及shell不再對括號做特殊解釋,這里轉義后的括號表示結合。

(注意,路徑后不能在加 ‘/’ 號!)

         -depth 先匹配所有的文件,再在子目錄中查找。即廣度遍歷查詢。注意加上-depth選項后,-prune選項失效。

         -maxdepth n  設定遞歸搜索的目錄層級,1為在當前目錄下,即不遞歸搜索。

   5、查詢執行:

         -exec command {} \; 對查詢的結果文件執行command 命令,{}中就包含着查詢結果。

         -ok command {} \; 與-exec有着相同的操作,不同的是,在執行command命令時會有交互提示你是否執行,是一種相對安全的做法。

在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高。轉

         xargs 與pipe連用,對匹配的文件執行操作。

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

例如,在當前路徑下的普通文件中搜索‘ admin ’:

$ find . -type f -print | xargs grep 'admin'

 對於一個參數的命令,xargs隱含傳遞匹配文件,如上述grep files,將結果隱含傳遞給files。如是多參數命令,如cp file dir,則要利用xargs的 -i 選項,例如將上述查詢的問價copy至‘ /usr ’:

$ find . -type f -print | xargs -i cp {} /usr/

加上 -i 選項后,xargs將匹配的結果傳遞給 {} ,這樣就方便多參數命令的使用了。

ok,打完手工,歡迎交流。

  

 


免責聲明!

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



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