1. 程式人生 > >文件查找命令——find

文件查找命令——find

find 文件查找

之前學過的grep,egrep,sed都是文本查找的相關命令,用來查找字符串的。
現在學習一下關於文件查找的命令。
文件查找:
locate:
非實時的,模糊匹配,查找是根據全系統文件數據庫進行的;系統的數據庫每天都會更新;
updatedb命令, 手動生成文件數據庫;
優勢是速度快,了解一下就可以了,文件查找主要使用find命令。


  • find:
    實時,精確,支持眾多查找標準;
    通過遍歷指定目錄中的所有文件完成查找,所以速度慢;

  • 用法:find 查找路徑 查找標準 查找到以後的處理運作
    查找路徑:可以省略,默認為當前目錄
    查找標準:可以省略,默認為指定路徑下的所有文件
    處理運作:可以省略,默認為顯示
    如果直接執行find命令,就會顯示當前目錄下的所有文件,包括子目錄。

  • 匹配標準:通過選項指定
    -name ‘FILENAME‘:根據文件名作精確匹配,註意文件名要加引號!
    文件名通配:比如 find /etc -name ‘passwd匹配在/etc下文件名有passwd的文件
    *:任意長度的任意字符
    ?:任意單個字符
    [ ]:指定範圍內的任意單個字符
    -iname ‘FILENAME‘: 文件名匹配時不區分大小寫
    -regex PATTERN:基於正則表達式進行文件名匹配,PATTERN是正則表達式的模式;

    -user USERNAME: 根據屬主查找,查找屬於某個屬主的文件。
    -group GROUPNAME: 根據屬組查找

    -uid UID: 根據UID查找
    -gid GID: 根據GID查找

    -nouser:查找沒有屬主的文件
    -nogroup: 查找沒有屬組的文件

    -type 根據文件類型查找
    f:普通文件
    d:目錄
    c:字符
    b:塊設備
    l:鏈接
    p:管道
    s:鏈接

    -size :根據文件大小查找,通常是一個數字加一個單位符。
    [+|-]#k:+10k 就是大於10k
    [+|-]#M:-10M就是小於10M
    [+|-]#G:同上一樣,如果不加+ - 號就是精確正好

  • 組合條件(一次完成多個條件):
    -a:與;兩個條件同時滿足比如:find /tmp -nouser -a -type d
    -o:或;滿足一個條件
    -not :非

  • 根據時間戳查找:
    -mtime:修改時間(單位是天)
    -ctime:改變時間
    -atime:訪問時間

    上面三個後面都可以加+ - 後面附數字,比如5表示距離今天正好五天訪問過,-5表示至少這五天訪問了,+5表示至少五天沒訪問了。
    -mmin:修改時間(單位是分鐘)
    -cmin:改變時間
    -amin:訪問時間
    [+|-]# 和上面的一樣
    比如:find /tmp -atime +5

  • 根據權限查找:
    -perm MODE:精確匹配
    /MODE: 任意一位匹配即滿足條件
    -MODE: 精確匹配;文件權限能完全包含此MODE時才符合條件
    內部有或和與邏輯比如:-001意思是其他組必須有執行權限的才匹配,其他的權限有沒有無所謂。/022表示組有寫權限或者其他組有寫權限的都可以匹配。
    例如:find /tmp -perm -007 這表示文件的其他組有讀寫執行權限的文件都匹配,屬主和屬組的權限無所謂是什麽。

  • 運作:
    默認-print: 顯示
    -ls:類似ls -l的形式顯示每一個文件的詳細
    -ok COMMAND {} \; 反斜線分號結尾,{}作為文件名稱占位符;每一次操作都需要用戶確認
    -exec COMMAND {} \; 和上一個ok用法一樣;只是每一次操作不需要用戶確認。
    比如:
    find ./ -perm -006 -exec chmod o-w {} \; 找到其他用戶可讀可寫的文件,將他的寫權限去掉chmod o-w是命令{}表示引用你找到的文件。
    find ./ -perm -020 -exec mv {} {}.new \; 找到屬組有寫權限的文件將他的名字改為原來的名字後面加.new,因為單純用mv命令應該這樣寫mv name name.new,所以{}出現兩次。只要引用文件名就要加{}。

文件查找命令——find