歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

find 用法詳解小記

find命令的功能很強大,查找文件的選項很多,所以這是一個很實用並且很常用的linux命令。但是他有個缺點就是搜索的時候比較慢的。而與之相對的有一個locate命令。
find的命令格式
    find pathname -option [-print ] [ -exec -ok command] {} \;
  
  2. 命令參數:
pathname : find命令所查找的目錄路徑。相對路徑和絕對路徑都可以的。
   -print: find命令將匹配的文件輸出到標准輸出(默認就是將找到的文件輸出到標准輸出)
    -exec command {} \ : find命令對匹配的文件執行該參數所給出的command命令,注意"{}"與 "\"之間的空格。
    -exec ok {} \: 與exec命令參數差不多,只不過多了一個檢查,在執行每一個命令之前要求用戶來確認是否執行。
  
 3. 命令的選項:
    常用:
    -name filename : 查找名為filename的文件(常用的選項)
    文件屬性:
    -perm xxxx :   按照xxxx代表的執行權限來查找
    -user username :按照文件屬主來進行查找
    -group groupname: 按照文件屬組進行查找
    -nouser     查找無有效屬主的文件,即屬主在/etc/passwd中不存在的
    -nogroup 查找無有效屬組的文件,即屬主在/etc/groups中不存在的
    文件時間屬性:
    -mtime -n +n 按照文件更改時間進行查找 , -n指n天以內 +n指n天以前
    -atime -n +n 按照文件訪問時間來查找
    -ctime -n +n 按照文件創建時間來查找
   -newer file1 ! file2 查找更改時間比file1新但是比file2舊的文件
    文件類型屬性:
    -type 查找某一個類型的文件
    b - 塊設備目錄
    d - 目錄
    c - 字符設備文件
    p - 管道文件
    l - 符號鏈接文件
    f - 普通文件
    其他類型
    -size n [c] : 查找文件長度為n塊的文件 ,帶 c 的時候表示文件長度以字節計算。
    -depth: 查找文件的時候首先查找當前目錄下,然後再查找其子目錄。
    -fstype: 查找位於某一類型的文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本文件系統的信息。
    -mount : 在查找文件時不跨越文件系統mount點。(這句話不是太理解哈,等下實例中看下。)
    -follow : 如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
    -cpio: 對匹配的文件使用cpio命令,將這些文件備份到磁盤設備中。
    -prune : 忽略某個目錄
  
    另外,下面三個的區別:
    -amin n 查找系統中最後N分鐘訪問的文件
    -atime n 查找系統中最後n*24小時訪問的文件
    -cmin n 查找系統中最後N分鐘被改變文件狀態的文件
    -ctime n 查找系統中最後n*24小時被改變文件狀態的文件
    -mmin n 查找系統中最後N分鐘被改變文件數據的文件
    -mtime n 查找系統中最後n*24小時被改變文件數據的文件
  4. 使用實例
  (1)-name選項
比較常用的選項,並且可以使用匹配符或者正則表達式來匹配文件(匹配符與正則的區別需要注意下)。如果是具體的文件名可以引號引起來也可以不用引號,但是文件名匹配模式是一定要用引號引起來的。
    
在根目錄“/”下查找文件名為 "test.txt"的文件
# find / -name  "test.txt"  -print

#匹配符與正則表達式的應用:
查找目錄下所有的  “*.log”
# find . -name "*.log"  -print

查找目錄下以大寫字母開頭的文件
# find / -name "[A-Z]*" -print

查找一個以小寫字母開頭,數字結尾的文件
# find /  -name "[a-z]*[0-9]" -print

  
    (2)文件屬性選項
      -perm xxx   
查找文件權限為755的文件,可以和-name混合使用
# find / -perm  755 -print

查找一個文件屬主是root,屬組也是root的文件(這種單獨使用是沒什麼意義的,這都是一些限制條件混合使用)
# find / -user root -group root -print   

當然還有查找屬主和屬組都已經被刪除的文件
# find . -nouser -nogroup -print

    (3)文件時間屬性
# 查找最後48小時內訪問過的文件
$  find / -atime  -2

# 查找最後24小時內修改過的文件
$  find / -mtime -1

    (4)忽略某個目錄
使用選項 -prune 支出忽略的目錄。使用-prune選項的時候注意不要和-depth一起用,-prune會被忽略。
#  忽略test目錄下的hello目錄
$  find test  -path "test/hello" -prune -o -print

說明下:find [-path] [expression]
在路徑列表後面是表達式
find test  -path "test/hello" -prune -o -print
-a 和 -o 是shell中的短路求值,與 && 和 || 結果類似。
-path "test/hello" 為真,則求值-prune ,則與邏輯為真,後面的-print不需要執行,否則求值 -print(利用-o的短路特性)
可以理解為如下所示的shell流程:

if -path "test/hello" then
-prune
else
-print

忽略多個目錄的操作:
find  test  \( -path test/test4 -o -path test/test3 \)  -prune  -o  -print

增加一個轉義 "\"
查找某一確定文件,-name等選項加在-o 之後
命令:
find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print

   (5)組合使用:操作之後加入命令 find pathname -option [-print ] [ -exec -ok command] {} \;
#查看當前目錄下的所有普通文件並通過ls -l來顯示詳細信息
$ find . -type f -exec ls -l {} \;

#還可以再加一些條件,組合使用
$ find logs  -type f -mtime +5 -exec -ok rm -rf {} \
#刪除五日以前有更改的文件  這個命令在運維的時候很有用,刪除一些日志文件的時候。

*有一個很好的應用場景是:find查找文件,然後grep看文件裡面是否有我們需要的字段
#在/tmp中尋找*.h,並在這些文件中查找"TEST"字段
$ find /tmp -name *.h | xargs -n50 grep TEST
$ find   /tmp   -name "*.h"   -exec grep "TEST"   {}   \; -print

#將查找到的文件復制到指定地方
$ find /tmp  -name test -exec cp '{}' /test ';'

特殊文件可以使用cpio的
$ find dir -name filename -print | cpio -pdv newdir  (暫時還不之後cpio的用法,先記錄下來)

#可以使用管道來處理find查找出來的 文件列表
$ find ./ -name "*.php" | ls -l -full-time 2>/dev/null | grep "2016-07-03 22:39"
查找2016-07-03 22:39更改過的文件

  
-----
參考鏈接:
每天一個linux命令find
linux find用法實例
Copyright © Linux教程網 All Rights Reserved