linux學習:find用法整理


find path -option [ -print ] [ -exec -ok command ] {} \;

path: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print 將查找到的文件輸出到標准輸出
-exec command {} \; 將查到的文件執行command操作,{} 和 \;之間有空格;{}標識匹配到的文件路徑或文件名
-ok 和-exec相同,只不過在操作前要詢用戶
===========================  option  ====================
-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   #忽略某個目錄
========================================================

以下總結一些實例:

基於文件類型:
find . -type d -print     #只列出當前目錄所有的子目錄
find . ! -type d -print  #只列出當前目錄的非子目錄(文件)
find . -type f -print     #只列出當前目錄所有的文件
find . -type l -print     #只列出當前目錄的所有符號鏈接
find . -type c -print    #只列出當前目錄的所有字符設備
find . -type b -print    #只列出當前目錄的所有塊設備
find . -type s -print    #只列出當前目錄的所有套接字
find . -type p -print    #只列出當前目錄的所有Fifo

基於路徑或文件名:
find . -name ap* -o -name may*             #查找以ap或may開頭的文件
find . -name "*.txt" -print               #在當前目錄中中查.txt文件並顯示
find . -name "[A-Z]*" -print              #在當前目錄中查以大寫字母開頭的文件並顯示
find /etc -name "host*" -print             #在/etc目錄中查以host開頭的文件並顯示
find . -name "[a-z][a-z][0–9][0–9].txt" -print    #查以兩個小寫字母和兩個數字開頭的txt文件
find . !-name "*.txt" -print             #列出所有不以.txt結尾的文件名
find /home/user -path "*ttt*" -print         #-path將文件路徑和文件名當做一個整體來匹配,所以文件路徑或者文件名中含有ttt的都會被匹配到
find . -name "*.txt" -print              #匹配當前目錄下所有.txt文件,並輸出其路徑
find . -iname "example*" -print            #匹配當前目錄下以example開頭的文件名,不區分大小寫,並輸出其路徑
find . \( -name "*.txt" -o -name "*.pdf" \) -print  #匹配當前目錄下所有.txt文件和.pdf文件,並輸出其路徑
find . -type f -name "*.swp" -delete         #刪除當前目錄下所有的.swp文件
find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt  #找到所有C文件並拼接起來寫入單個文件all_c_files.txt。find命令的輸出只是一個單數據流,所以不用>>進行追加
find /mnt -name tom.txt -ftype vfat       #在/mnt下查找名稱為tom.txt且文件系統類型為vfat的文件
find /mnt -name tom.txt ! -ftype vfat       #在/mnt下查找名稱為tom.txt且文件系統類型不為vfat的文件

基於用戶文件權限:
find . -perm 755 -print              #查當前目錄下下權限為755的文件
find / -group cat                  #查找在系統中屬於cat組的目錄和文件
find / -nouser                    #查找在系統中屬於作廢用戶的文件
find / -user fred                   #查找在系統中屬於fred這個用戶的文件
find . -type f -user ubuntu -print            #列出當前目錄下屬於用戶ubuntu的文件
find . -type f -name "*.php" | -perm 644 -print    #列出當前目錄下所有權限為644的php文件
find /home -uid +501                #列出/home目錄內用戶的識別碼大於501的文件或目錄
find /home -gid 501                 #列出/home內組id為501的文件或目錄
find /home -nouser                  #列出/home內不屬於本地用戶的文件或目錄
find /home -nogroup                  #列出/home內不屬於本地組的文件或目錄

基於目錄或文件大小:

find . -name "*" -type f -size 0c | xargs -n 1 rm -f    #批量刪除空文件(大小等於0的文件)的方法
find . -type f -empty            #查找大小為0的文件或空目錄
find . -type f -size +1000000c -print    #查長度大於1Mb的文件
find . -type f -size 100c -print      # 查長度為100c的文件
find . -type f -size +10 -print       #查長度超過期作廢10塊的文件(1塊=512字節)
find . -type f -size +2k            #搜索當前目錄下大於2KB的文件
find . -type f -size -2k          #搜索當前目錄下小於2KB的文件
除了千字節KB(k)之外,還有塊(b 512字節),字節(c),字(w),兆字節(M),吉字節(G)

基於操作時間:
find / -type f -amin -10            #查找在系統中最后10分鍾訪問的文件
find / -type f -atime -2             #查找在系統中最后48小時訪問的文件
find / -type f -empty            #查找在系統中為空的文件或者文件夾
find / -type f -mmin -5             #查找在系統中最后5分鍾里修改過的文件
find / -type f -mtime -1            #查找在系統中最后24小時里修改過的文件
find /home -type f -mtime -2       #在/home下查最近兩天內改動過的文件
find /home -type f -atime -1        #在/home下查1天之內被存取過的文件
find /home -type f -mmin +60       #在/home下查60分鍾前改動過的文件
find /home -type f -amin +30       #在/home下查最近30分鍾前被存取過的文件
find . -type f -atime -7 -print        #列出當前目錄在最近7天內被訪問過的所有文件
find .-type f -atime 7 -print        #列出當前目錄恰好在第七天前被訪問過的所有文件
find . -type f -atime +7 -print        #列出當前目錄訪問時間超過七天的所有文件
find . -type f -newer file.txt -print        #找出當前目錄比file.txt修改時間更長的所有文件,使用-newer,可以指定一個用於比較的時間戳參考文件
find /home -type f -anewer tmp.txt      #在/home下查存取時間比tmp.txt近的文件或目錄
find /home -used -2              #列出文件或目錄被改動過之后,在2日內被存取過的文件或目錄
find ./ -type f -mtime -1 -exec ls -l {} \    #查詢當前目錄下當天修改過的文件的詳細信息
find ./ -type f -mtime -1 -ok ls -l {} \       #查詢當前目錄下當天修改過的文件的詳細信息並詢問是否顯示
(-atime是根據訪問時間;-mtime是根據修改時間;-ctime是根據變化時間。三個參數的單位都是天)
(-amin是根據訪問時間;-mmin是根據修改時間;-cmin是根據變化時間。這三個參數的單位是分鍾)

find與-exec參數:
find . -perm -007 -exec ls -l {} \;                #查所有用戶都可讀寫執行的文件同-perm 777
find . -type f -user root -exec chown ubuntu {} \;           #將當前目錄下所有root的文件改為屬於ubuntu,此處{}會替換成每一個匹配的文件名,{}表示匹配,與-exec結合使用
find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt     #找到所有C文件並拼接起來寫入單個文件all_c_files.txt。find命令的輸出只是一個單數據流,所以不用>>進行追加
find . -type f -atime +10 -name "*.txt" -exec cp {} /data \;     #找到10天前訪問的.txt文件並復制到/data目錄中
find ./log02* -exec mv {} /data/game \;              #找到當前目錄下以log02開頭的文件並將其移動到/data/game目錄下
find . -type f -mtime +5 -exec -ok rm {} \            #在當前目錄中查找更改時間在5日以前的文件並刪除它們
find . -type f -name "*.txt" -exec printf "Text file:%s\n" {} \;   #-exec結合printf輸出信息
(find 的-exec參數可以接其他任何命令,具體看需求是怎樣的)

find 與 xargs 組合:

find . -type d -empty | xargs rmdir              #刪除當前目錄下所有空文件夾

find . -type f -empty | xargs rm -rf     #遞歸查找當前目錄及子目錄下所有空文件並刪除,rm 的 -r參數表示遞歸,-f表示強制刪除

find . -name "*.txt" | xargs rm -rf                #查找當前目錄下所有.txt文件並刪除

find . -type f -name "*.txt" -print0 | xargs -0 rm -f        #匹配並刪除所有的.txt文件,xargs -0將\0作為輸入定界符
find /data -type f -name "*.c" -print0 | xargs -0 wc -l       #統計/data目錄下所有C文件的行數
find ./ -name "test*.log" | xargs grep "\[AAAA\]" | wc –l      #通過第一個管道find查找當前目錄下所有以test開頭的log文件的內容,並將內容輸送到第二個管道xargs grep,過濾並查找出所有含有”[AAAA]”的行,然后再送給wc命令進行統計行數
find ./ -name "test*.log" | xargs grep "\[AAAA\]" > re.txt    #同上例,將查找到的行重定向到re.txt文件
find ./ -name "test*.log" | xargs grep "\[AAAA\]" | grep "\"SVR\":1" >re.log                    #同上例,當需要匹配多個字段時:例如此時匹配[AAAA]和 ”SVR”:1 兩個字段
find ./ -name "test*.log" | xargs grep "\[AAAA\]" | grep "\"SVR\":1" | grep "\[2016-12-27 10:01:59\]" > re.log   #同上例,多匹配一個[Y-m-d H:i:s]格式的時間字段
(xargs命令應該緊跟在管道操作符后面,以標准輸入作為主要的源數據流。)

其他:
find . -iregex ".*\(\.py\|\.sh\)$"               #-iregex忽略正則表達式的大小寫 此處為忽略后綴的大小寫
find . -maxdepth 2 -type f -print               #遍歷的最大深度距離此目錄最多為2層子目錄,列出所有普通文件
find . -mindepth 2 -type f -print                #遍歷的深度距離當前目錄至少兩個子目錄,列出所有文件
find /data \( -name ".git" -prune \) -o \( -type f -print \)      #在/data目錄下搜索所有文件,搜索時跳過.git子目錄。 \( -name ".git" -prune \)這里用於排除.git目錄
find /etc -name "passwd*" -exec grep "cnscn" {} \       #看是否存在cnscn用戶
find . -type f -name april* fprint file               #在當前目錄下查找以april開始的文件,並把結果輸出到file中
find . -links +2                         #查硬連接數大於2的文件或目錄

 

其他查找的命令:

whereis:用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。例如:whereis php、whereis grep...

which :在PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果。檢查系統命令是否存在,以及執行的到底是哪一個位置的命令。例如:which php、which grep...

locate:是“find -name”的另一種寫法,但是要比后者快得多,原因在於它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。

  locate /etc/sh    #搜索etc目錄下所有以sh開頭的文件。

  locate ~/m       #搜索用戶主目錄下,所有以m開頭的文件。

  locate -i ~/m   #搜索用戶主目錄下,所有以m開頭的文件,並且忽略大小寫。


免責聲明!

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



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