shell中find命令的使用要點

來源:互聯網
上載者:User

shell中find命令的使用要點 linux中的find的命令尋找檔案的重要方式,輔以其他的bash命令可以實現強大的操作效果。 先看看放find命令的基本組成: find pathname -option [-print -exec -ok ...] 分類記憶各項屬性參數~   pathname:指定find命令的查詢根路徑,例如 ‘ / ’,‘./ ' 等。           同時還可在-path參數中指定搜尋路徑。   -option:    1、檔案操作:         -name 用引號” “將查詢的檔案名稱括起來,可適用於簡單的Regex(應改為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 給出檔案路徑,可在路徑中查詢,滿足簡單Regex(元字元)。例如尋找當前路徑中' ./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選項失效。    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將匹配的結果傳遞給 {} ,這樣就方便多參數命令的使用了。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.