網頁

2013年3月9日 星期六

find 指令


  • find的基本格式
    • find [path] [expressioin]
    • 常用的選項
      • path:find 查找路徑。如果未指定,則默認為當前工作目錄。
      • Expression:用于定義find查找的表達式,表達式通常由選項、測式和動作3類參數組成。
      • 常用的選項說明
        • help:獲得幫助信息
        • depth:先從當前目錄中查找,然后再從當目錄的子目錄中查找
        • maxdepth LEVELS:向下搜索到第LEVELS層目錄,當LEVELS=0時表示只在當前目錄查找。
        • mindepth LEVELS:至少向下搜索LEVELS層目錄
        • mount:不搜索遠程文件系統
        • follow:搜索如果遇到鏈接文件就連鏈接所指向的文件一並檢查。
      • 常用的測試參數
        • name:按文件名查找
        • perm:按文件權限查找
        • type:查找某一類型的文件
        • mtime+n-n:按文件的修改的時間查找,+n表示修改時間距現在n天以前,-n表示修改時間距現在n天以內。
        • atime+n-n:按文件的訪問時間找文件(使用方法同上)
        • size n[c]:查找文件長度為n塊的文件,c表示文件大小為n字節的文件
        • User:按文件屬主查找
        • group:按文件的群組查找
        • nouser:查找沒有有效屬主的文件
        • nogroup:查找沒有有效群組的文件
      • 動作參數指定find命令如何查找和處理查找到的文件,常用的動作有如下4種
        • prune:不在指定目錄中查找
        • print:將查找到的文件輸出到標準輸出
        • exec:對查找到的文件執行exec動作後附帶的shell命令
        • ok:對查找到的文件執行ok動作後附帶的shell命令,在每次執行前將提示用戶是否執行。
    • find有許屬參,大多數情況下,使用該命令都至少要包含一個測式和一個動作,才能完成整個查找任務。
    • 範例:
      • 按文件名稱查找
        • find /etc -name "smb.conf" -print
        • find /etc -name "*.conf" -print
        • find -name "message" -print
          • 上行是在當前的目錄中查找
        • 查找前2個字符是小寫字母,第3個字符是數字,最後.d的文件
          • find /etc -name "[a-z][a-z][0-9].d" -print
        • 使用find命令查找文件時,使用操作符&將其放到後台運行
          • find / -name "*.conf" -print & 
      • 按文件權限查找
        • perm參數可以按照文件的權限進行查,使用此參數時,需要使用8進制表示權限。
          • 8進制的基本說明:4讀的權限;2寫的權限;1執行的權限
        • 查找權限為644的文件
          • find / -perm 644 -print
          • 在當前目錄的file子中查找權限中包點其他用戶可讀、寫、執行的文件
            • find ./file -perm -007 -print
      • 按文件類型查找
        • 查找/dev目錄中的字符設備,其中c很示字符設備
          • find /dev -type c -print
        • 查找目錄/dev中的塊設備文件,其中b表示塊設備文件
          • find /dev -type b -print
        • 查找目錄/etc中除了鏈接文件以外的文件
          • find /etc ! -type l -print
        • 其他的type,其實於ls命令的格式中的文件類型標識一致,d-->目錄;l-->鏈接文件
      • 按文件的時間和大小查找
        • 使用+n限定時間在n天以前;使用-n限定時間在n天以內。
        • 使用-7指定修改時間在7天以內的文件
          • find /etc -mtime -7 -print
        • 使用+1指定修改時間在1天以前的文件
          • find /etc -mtime +1 -print
        • 使用atime -10 指定訪問時間在10天以內的文件
          • find /etc -atime -10 -print
      • 按長度查找文件
        • 當前目錄下查找文件長度大於10MB的文件
          • find . -size +10000000c -print
        • 使用-30 表示文件長度小於30塊(512*30=15kb)的文件
          • find . -size -30 -print
      • 按文件屬主或屬組查找
        • 使用user參查找屬主為canred的文件
          • find / -user canred -print
        • 使用nouser的參數查找沒有有效屬主的文件
          • find / -nouser -print
        • 使用group的參數查找屬組為admin的文件
          • find / -group admin -print
        • 使用nogroup的參數查找沒有有效屬組的文件
          • find / -nogroup -print
      • 忽略目錄參數prune
        • 使用path,prune和name參數指定在除了/etc以外的整個目錄中查找以.conf結尾的配置文件
          • find / -path "/etc" -prune -o -name "*.conf" -print
            • -o是說:將2個不同的參數連接起來
      • 忽略遠程文件系統參數mount
        • 如果系統上掛載有遠程文件系統,搜索視程文件系統不僅要花費大量的網絡資源及時間,這時可以使用mount參數忽略掛載的遠程文件系統
          • 使用mount參數忽略遠程文件系統
            • find / -name "file" -mount -print
            • 注意:在使用prune參數查找文件時,如果同恃使用了depth參數,find會將prune參數忽略
      • 使用exec和ok處理查找到的文件
        • exec、ok參數執行shell命令的格式如下:
          • -exec [shell命令] {} \;
          • -ok [Shell] {} \;
        • 在當前目錄的backup_sys子目錄中,查找修改時間在一周以前,以message開頭的文件然後將找到的文件交給ls -l命令
          • find ./backup_sys -name "message*" -mtime +7 -exec ls -l {} \;
        • 查找修改時間在2週以前的文件,並使用exec參數將找到的文件交給rm命令刪除
          • find ./backup_sys -name "message*" -mtime +14 -exec rm {} \;
          • 也可以把上例改成ok如下
          • find ./backup_sys -name "message*" -mtime +14 -ok rm {} \;
    • 使用xargs命令處理查找到的文件
      • 利用exec 、 ok參數處理查找到的文件時,存在了一些缺陷
        • 系統對參數exec、ok傳遞給shell命令的文件列表長度有一定的限制。當find命令查找到的文件數量很多時,會出現參數列表溢出錯誤。
        • 參數對find命令找到的每一個文件發起一個相應的處理進程,當find命令查找到的文件數量很多時,可能會影響整個系統性能
      • xargs命令的作用是構造一個參數列表並交給命令執行。與參數exec、ok相比,xargs不會一次獲取並處理find找到的所有文件,而是每次只獲取並處理其中的一部份。處理完後再獲取下一部分,直至結束。整個過程xargs都只發起一個處理進程,對系統性能的影響很小。
        • 使用管道將找到的文件列表交給xargs命令分割之後使用rm命令刪除
          • find ./backup_sys -name "message*" -mtime +14 -print | xargs rm
    • find工具應用實例
      • 1.使用find查找需要備份的文件
        • 第一次完成備份
          • tar -czf /backup/file_backup_20130309.tgz /file
        • 第二次之後就是差異備份
          • find /file -type f -mtime -1 -print > /backup/file_list
          • 使用tar命令備份/backup/file_list中記錄的文件
            • tar -czT /backup/file_list -f /backup/file_backup_20130310.tgz
          • 刪除使用過的文件列表
            • rm /backup/file_list
      • 2.刪除過期文件
        • find . -mtime +14 -exec rm {} \;

沒有留言:

張貼留言