linux文件查找工具 — find

簡述:

  linux中find命令是一種強大的實時查找工具,它通過用戶給出的路徑,在該路徑下的文件系統中進行文件查找。因此在遍歷一個較大的文件系統時會比較花費時間,而且find命令占用資源也是比較大的,所以它的工作特點是,查找的速度略慢,但是可以實現精確查找和實時查找。由于用戶權限的問題,可能只搜索用戶具備讀取和執行權限的目錄。由于find命令能力很強大所以它的選項也有很多。


find命令用法:

find命令格式:

     find 【選項】 【查找起始路徑】 【查找條件】 【處理動作】

     find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]

【選項】:[-H] [-L] [-P] [-D debugopts] [-Olevel]這幾個并不常用,其中-H,-L,-P三個選項主要用來處理符號鏈接,

    -H表示只跟隨命令行中指定的符號鏈接;

    -L表示跟隨所有的符號鏈接;

    -P表示不跟隨符號鏈接,默認選項;

【查找起始路徑】:根據用戶跟定的目標起始路徑進行查找,默認是當前目錄;

【查找條件】:根據用戶指定的標準進行查找;默認是找出指定路徑下的所有文件;

    查找條件大致分為以下幾類:;

①根據文件名進行查找:

        -name;-iname

    如:查找當前目錄下以“.cfg結尾的文件” 

~]# find . -name "*.cfg"

     此處匹配時glob通配符匹配不支持正則表達式。使用-iname可不區分字符大小寫。

②根據inode號查找

    -inum n 查找inode號為n的文件

    -samefile f1 查找與文件f1相同inode號的文件

    -links n 鏈接數為n的文件

    -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱

~]# find -inum 1800 -ls
  1800    0 drwxr-xr-x   2 root     root            6 Aug  3 23:21 ./dir1

~]# find . -regex ".*\.sh$"
./scripts/a.sh
./scripts/arg.sh

③根據屬主屬組查找

    -user USERNAME:查找屬主為指定用戶(UID)的文件

    -group GRPNAME: 查找屬組為指定組(GID)的文件

    -uidUserID:查找屬主為指定的UID號的文件

    -gidGroupID:查找屬組為指定的GID號的文件

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

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

  如:查找/var目錄下屬主為root,且屬組為mail的所有文件

~]# find /var -user root -group mail 
/var/spool/mail
/var/spool/mail/root

④根據文件類型查找:

    -type (f,d,l,c,b,p,s)

    f:普通文件

    d:目錄文件

    l:符號鏈接文件

    c:字符設備文件

    b:塊設備文件

    p:管道文件

    s:套接字文件

如:查找當前目錄下的目錄文件

~]# find -type d
.
./.ssh
./.cache
./.cache/abrt

⑤根據文件大小查找:

    -size [+/-]#UNIT  (#代表數字,UNIT代表單位)常用單位k,M,G

    #UNIT:(#-1,#] 表示大于#-1,小于等于#的區間

    -#UNIT:[0,#-1] 表示大于等于0,小于等于#-1的區間

    +#UNIT:(#,∞)表示大于#至正無窮的區間

  如:查找/etc目錄行啊大于1M且類型為普通文件的所有文件

 ~]# find /etc/ -size +1M -type f
/etc/selinux/targeted/policy/policy.29
/etc/udev/hwdb.bin

⑥按時間戳查找:

    linux文件系統中每個文件都有三種時間戳,以天為單位,分別是:

  • 訪問時間atime(access time),最后一次訪問文件的時間;

  • 狀態改變時間ctime(change time),最后一次改變文件的狀態或屬性的時間

  • 修改時間mtime(modity time),最后一次改變文件內容的時間

   -atime [+/-]# (#代表數字)

    -#:(#,0] 表示第#天前到現在的時間

    #:[#,#-1) 從第#天前到第#-1天之間的時間

     +#:(∞,#-1]表示包括第#-1天之前的時間

   -ctime [+/-]# 

   -mtime [+/-]#

17.png

還有一種一分鐘為單位的表示時間,分別為-amin.-cmin,-mmin用法和atime之間完全一樣,就不再舉例說明。

如:查找當前系統上沒有屬主或屬組,且最近一周內曾被訪問過的文件或目錄

 ~]# find / \( -nouser -o -nogroup \) -atime -7 -l

⑦根據權限查找:

   -perm [/|-]mode 

     /mode:表示任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足條件;9位權限之間存在"或"的關系

如:只要當任意人有寫權限時,find -perm /222就會匹配

    -mode:表示每一位用戶的權限中的每一位同時符合條件即滿足條件;9位權限之間存在"與"的關系

如:只有當每個人都有寫權限時,find -perm -222才會匹配

 0表示不關注

如:只有當其它人(other)有寫權限時,find- perm -002才會匹配

   -perm mode 表示精確匹配

如:find -perm 755 會匹配權限模式恰好是755的文件

⑧條件限制,組合使用,匹配多個

    與:-a 默認組合邏輯

    或:-o 

    非:-not或!

德·摩根定律:

非(P 且Q) = (非P) 或(非Q)

11.png

非(P 或Q) = (非P) 且(非Q)

12.png

所以:

!A -a !B = !(A -o B)

!A -o !B = !(A -a B)

如:查找/var目錄下不屬于root、lp、gdm的所有文件

13.png

14.png

可以看到兩種情況是相等的

當find根據權限查找的時候,可以結合德·摩根定律來使用,前文已經提到 -perm /mode  9位權限之間存在"或"的關系,而-perm -mode權限之間存在"與"的關系。所以當權限查找結合德·摩根定律使用時。

! -perm /mode 即表示:所有用戶都沒有相應的權限;

! -perm -mode 即表示:至少有一種用戶沒有相應的權限;

如:

1、查找/etc目錄下所有用戶都沒有寫權限的文件

15.png

2、查找/root目錄下至少有一種用戶沒有執行權限的文件

16.png

【處理動作】對符合查找條件的文件做出操作;默認為輸出值標準輸出。

    -print:輸出至標注輸出;默認動作

    -ls:類似與對查找到的文件執行ls-l命令。輸出文件的詳細信息

    -delete:刪除查找到的文件

    -fls /path/to/somefile:把查找到的所有文件的長格式信息保持你至指定文件中

    -ok COMMAND{}\;:對查找到的每個文件執行COMAND表示的命令;每次操作都由用戶進行確認;

    -exec COMMAND{}\;:對查找到的每個文件執行COMAND表示的命令;

            注:{}表示匹配到的文件

如:查找/etc目錄下一wd結尾的文件,并找出文件中含有root的行

 ~]# find /etc -name "*wd" -exec grep "root" {} \;

18.png

  但是在使用-exec選項時,find是將所有匹配到的文件一次性傳遞給exec執行,但是有些文件過長,可能會發生溢出錯誤。

  所以需要注意的是:find傳遞查找到的文件路徑至后面的命令時,是先查找出所有符合條件的文件路徑,并一次性傳遞給后面的命令;但有些命令不能接受過長的參數,此時命令執行會失敗;我們可以使用另一種方式可規避此問題:find | xargs COMMAND

   在此簡單說一下xargs命令,之所以能用到這個命令,主要實時由于很多命令不支持管道來傳遞參數,而平時工作又經常需要,所以有就有了xargs命令。xargs是給命令傳遞參數的一個過濾器,也是組合多個個命令的一個工具。它把一個數據流分割為一些足夠小的快,以方便命令進行處理。xargs從管道或者stdin中讀取數據,并且以空白字符作為分割,所以,有一些包含空白字符的文件名或特殊意義到的名詞時,容易發生誤判。

 如:查找當前目錄下以“.cfg結尾的文件” 并刪除

 ~]# find . -name "*.cfg" | xargs rm -rf


練習示例:

1、查找/var目錄下屬主為root,且屬組為mail的所有文件

find /var -user root -group mail

1.png

2、查找/var目錄下不屬于root、lp、gdm的所有文件

find /var -not  \( -user root -o lp -o gdm \)

2.png

3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件

find /var -mtime -7 -not \( -user root -o -user postfix \)

3.png

4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件

find /  -atime -7  \( -nouser -o -nogroup \)

4.png

5、查找/etc目錄下大于1M且類型為普通文件的所有文件

find /etc -size +1M -type f -ls

5.png

6、查找/etc目錄下所有用戶都沒有寫權限的文件

find ! -perm /222  -ls

6.png

7、查找/root目錄下至少有一類用戶沒有執行權限的文件

find /root ! -perm -111  -ls

7.png

8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件

find /etc/init.d/  -perm -113

8.png

原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/36299

(0)
GrootGroot
上一篇 2016-08-18
下一篇 2016-08-18

相關推薦

  • Linux系統時間簡單修改方法

          Linux時鐘分為系統時鐘(System Clock)和硬件(Real Time Clock,簡稱RTC)時鐘。系統時鐘是指當前Linux Kernel中的時鐘,而硬件時鐘則是主板上由電池供電的時鐘,這個硬件時鐘可以在BIOS中進行設置。Linux中的所有命令(包括函數)都是采用的系統時鐘設置。Linux操作系統運行…

    Linux干貨 2015-06-12
  • 壓縮、解壓縮和歸檔工具

    1  compress和uncompress 用法:     compress [-dfvcVr] [-b maxbits] [file…] 選項:     -d   解壓縮     -c   結果…

    Linux干貨 2016-08-18
  • N26-博客作業-week13

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)  1)共享名為shared,工作組為magedu;  2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名;  3)添加samb…

    Linux干貨 2017-06-15
  • Shell腳本編程—特殊用法(select)及函數、遞歸

    Shell腳本編程—特殊用法及函數   一、while的特殊用法: 1、使用格式: while read 變量名;do    循環體 done </PATH/TO/filename 注:依次從指定的文件中的內容逐行讀取,并把讀取到的每行賦值給變量。 2、例題: 掃描/etc/passwd文件每一行,如發現GECOS字段為空…

    Linux干貨 2016-08-21
  • yum的簡單配置與使用

    yum 的基本配置與使用 1、yum:是rpm包管理器的前端工具,它是基于C/S結構,就客戶端服務器模式 2、yum使用前需先配置好服務端的倉庫(yum源) 3、yum客戶端是通過文件傳輸協議來獲取到yum源上的軟件包的,yum一共支持四種傳輸協議 http:// https:// ftp:// file:// (這是一個本地路徑,當yum源為本地光盤時,使…

    Linux干貨 2017-06-11
  • CentOS 7源碼安裝httpd服務

    httpd的簡介     httpd是一個開源軟件,且一般用作web服務器來使用。目前最流行的web服務器軟件叫做httpd,httpd還有一個俗稱叫apache,Apache是一個軟件基金會,httpd也是這個軟件基金會的一個項目。在早期的http server就叫做apache,到了http server 2.0以…

    Linux干貨 2016-08-24

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 14:40

    練習題第二天有問題,粘貼是不夠用心哦。find命令需要多練習才能做到熟練運用。

欧美性久久久久