強大的查找工具之find命令

一、Linux中的文件查找工具

    在文件系統上常常需要根據文件的各種屬性去查找符合條件的文件,此前講到的grep、egrep屬于文本過濾、文本搜索工具;而文本查找工具有兩個,local和find

二、Linux中的查找工具簡介
locate 命令 find 命令
簡介:locate屬于非實時查找,依賴于事先構建的索引;索引的創建是在空閑時由系統自行進行(周期性任務);手動更新數據庫進行使用update命令;索引構建過程需要遍歷整個根文件系統,及其耗費資源 簡介:find屬于實時查找工具,通過遍歷指定路徑下的文件系統完成文件查找
特點:查找速度快、模糊查找、非實時查找、搜索的是文件的全路徑,不僅僅是文件名、可能只搜索用戶具備讀取和執行權限的目錄 特點:查找速度略慢、精確查找、實時查找、可能只搜索用戶具備讀取和執行權限的目錄

三、locate和find的使用

locate 命令

簡介:
locate - find files by name
格式:
locate [OPTION]... PATTERN...
選項:
-i:執行區分大小寫的搜索
?-n N:只列舉前N個匹配項目
示例:
locate foo:搜索名稱或路徑中帶有“foo”的文件
locate -r ‘\.foo$’:使用Regex來搜索以“.foo”結尾的文件
舉例:
[root@centos6 ~]# locate -n 3 passwd  # 只匹配字符串passwd到第三個目錄
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
[root@centos6 ~]# 

[root@centos6 ~]# mv /var/lib/mlocate/mlocate.db ./      # locate是基于mlocate.db文件查找的
[root@centos6 ~]# locate -n 3 passwd
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
[root@centos6 ~]#

find 命令

簡介:
find - search for files in a directory hierarchy
格式:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
選項:
(1)根據文件名和inode查找
  -name "文件名稱":支持使用glob;*, ?, [], [^]
  -iname"文件名稱":不區分字母大小寫
  -inumn:按inode號查找
  -samefilename:相同inode號的文件
  -links n:鏈接數為n的文件
  -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
  
(2)根據屬主、屬組查找
  -user USERNAME:查找屬主為指定用戶(UID)的文件
  -group GRPNAME: 查找屬組為指定組(GID)的文件
  -uidUserID:查找屬主為指定的UID號的文件
  -gidGroupID:查找屬組為指定的GID號的文件
  -nouser:查找沒有屬主的文件
  -nogroup:查找沒有屬組的文件
  
(3)根據文件類型查找
 格式:-type TYPE
 f: 普通文件
 d: 目錄文件
 l: 符號鏈接文件
 s:套接字文件
 b: 塊設備文件
 c: 字符設備文件
 p: 管道文件
 
(4)組合條件
 與:-a
 或:-o
 非:-not, !
 德·摩根定律:(非P) 或(非Q)= 非(P 且Q);(非P) 且(非Q) = 非(P 或Q)
 示例:!A -a !B = !(A -o B);!A -o !B = !(A -a B)
 
(5)根據文件大小來查找
  -size [+|-]#UNIT
       常用單位:k, M, G
       #UNIT: (#-1, #]:如:6k 表示(5k,6k]
       -#UNIT:[0,#-1]:如:-6k 表示[0,5k]
       +#UNIT:(#,∞):如:+6k 表示(6k,∞)
       
(6)根據時間戳
  以“天”為單位;
  -atime [+|-]#
        #: [#,#+1)
       +#: [#+1,∞]
       -#: [0,#)
  -mtime [+|-]#
        #: [#,#+1)
       +#: [#+1,∞]
       -#: [0,#)
  -ctime [+|-]#
        #: [#,#+1)
       +#: [#+1,∞]
       -#: [0,#)
  以“分鐘”為單位:
  -amin [+|-]#  
        #: [#,#+1)
       +#: [#+1,∞]
       -#: [0,#)  
  -mmin [+|-]#  
        #: [#,#+1)
       +#: [#+1,∞]
       -#: [0,#) 
  -cmin [+|-]#  
        #: [#,#+1)
       +#: [#+1,∞]
       -#: [0,#)
       
 (7)根據權限查找
   格式: -perm [/|-]MODE
   MODE: 精確權限匹配
   /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰
   -MODE:每一類對象都必須同時擁有指定權限,與關系0 表示不關注
   示例:
   find -perm 755:會匹配權限模式恰好是755的文件
   只要當任意人有寫權限時,find -perm +222就會匹配
   只有當每個人都有寫權限時,find -perm -222才會匹配
   只有當其它人(other)有寫權限時,find -perm -002才會匹配
 (8)處理動作
    -print:默認的處理動作,顯示至屏幕
    -ls:類似于對查找到的文件執行“ls -l”命令
    -delete:刪除查找到的文件
    -flsfile:查找到的所有文件的長格式信息保存至指定文件中
    -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認
    -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
    {}: 用于引用查找到的文件名稱自身
    find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
    
    Note:有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題;find | xargsCOMMAND
示例1:
find -name snow.png   #搜索名為snow.png的文件
find -iname snow.png   #不分大小寫地搜索名為snow.png、Snow.png、SNOW.PNG等等的文件
find / -name “*.txt”   #查找根目錄下,以".txt"結尾的文件
find /var –name “*log*”   #查找"/var"目錄下,中間跟了"log"單詞的文件
find -user joe -groupjoe   #查找用戶joe 以及組群joe所擁有的文件
find -user joe -not -groupjoe   #查找用戶joe 但是組群不是joe所擁有的文件
find -user joe -o -user jane   #查找用戶joe 或者組群是jane所擁有的文件
find -not \( -user joe -o -user jane \)   #查找不是用戶joe 且組群不是jane所擁有的文件
find / -user joe -o -uid 500  #查找不是用戶joe 或者組群不是用戶id500所擁有的文件
示例2:
(1)找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp\( -not -user root -a -not -name 'f*' \) -ls
find /tmp-not \( -user root -o -name 'f*' \) –ls

(2)排除目錄
示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf后綴的文件
find /etc-path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
示例3:
find -name “*.conf” -exec cp {} {}.org \;   #備份配置文件,添加.orig這個擴展名
find/tmp-ctime+3-userjoe-okrm{}\;   #提示刪除存在時間超過3天以上的joe的臨時文件
find~-perm-002 -execchmodo-w{}\;   #在你的主目錄中尋找可被其它用戶寫入的文件
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;   #查找/data目錄下的文件類型為普通文件且權限為644,名稱以".sh"結尾文件,最后查找的文件權限更改為755
find /home –type d -ls   #查找/home目錄下文件類型為目錄的文件,并以長格式顯示文件

四、作業

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

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

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

[root@centos6 ~]# find /var/ -not \( -user root -o -user lp -o -user gdm \)

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

[root@centos6 ~]# find /var/ -mtime -7 -not \( -user root -o -user postfix \)

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

[root@centos6 ~]# find / \( -nouser -o -nogroup \) -mtime -7

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

[root@centos6 ~]# find /etc/ -size +1M -type f

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

[root@centos6 ~]# find /etc/ -perm -222

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

[root@centos6 ~]# find /etc/ -perm +11

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

[root@centos6 ~]# find /etc/init.d/ -perm -113

五、總結

1、總結find的德.摩根定律及應用示例

(1)詳解

德.摩根定律 find的德.摩根定律
(非 P) 或 (非 Q) = 非(P 且 Q) find /var/ -not -user root -o -not -user mail = find /var/ -not \( -user root -a -user mail \)
(非 P) 且 (非 Q) = 非(P 或 Q) find /home/ -not -user root -a -not -user nginx = find /home/ -not \( -user root -o -user nginx \)

blob.png

(2)示例

例子1:
[root@centos6 ~]# find /tmp/ -not -user nginx -not -user root  #查找‘/tmp目錄下屬主不是root且不是nginx的文件’
/tmp/pulse-SGeqTq3cfHFi
/tmp/orbit-gdm
/tmp/orbit-gdm/linc-2593-0-6447e99080a09
/tmp/orbit-gdm/linc-25bb-0-3306608dc8c8a
/tmp/orbit-gdm/linc-25b3-0-607a875fbe5b6
/tmp/orbit-gdm/linc-25b4-0-1da9ddb2bdf32
/tmp/orbit-gdm/linc-25f0-0-13bd5772d233c
/tmp/orbit-gdm/linc-25af-0-78f6404cb32fd
/tmp/orbit-gdm/linc-258a-0-7aaa4b2481edf
/tmp/orbit-gdm/linc-25b2-0-6bd1688dbe162
/tmp/orbit-gdm/linc-25a4-0-1a415a8da0574
/tmp/orbit-gdm/linc-25b1-0-290420a7be495
/tmp/orbit-gdm/linc-25b0-0-27f32254bb463
[root@centos6 ~]# find /tmp/ -not \( -user nginx -o -user root \)  #使用摩根定律簡寫
/tmp/pulse-SGeqTq3cfHFi
/tmp/orbit-gdm
/tmp/orbit-gdm/linc-2593-0-6447e99080a09
/tmp/orbit-gdm/linc-25bb-0-3306608dc8c8a
/tmp/orbit-gdm/linc-25b3-0-607a875fbe5b6
/tmp/orbit-gdm/linc-25b4-0-1da9ddb2bdf32
/tmp/orbit-gdm/linc-25f0-0-13bd5772d233c
/tmp/orbit-gdm/linc-25af-0-78f6404cb32fd
/tmp/orbit-gdm/linc-258a-0-7aaa4b2481edf
/tmp/orbit-gdm/linc-25b2-0-6bd1688dbe162
/tmp/orbit-gdm/linc-25a4-0-1a415a8da0574
/tmp/orbit-gdm/linc-25b1-0-290420a7be495
/tmp/orbit-gdm/linc-25b0-0-27f32254bb463
[root@centos6 ~]#
例子2:
[root@centos6 ~]# find /var/mail/ -not -user root -o -not -user mail   #查找/var/mail/目錄下屬主不屬于root或者不屬于mail用戶的文件
/var/mail/
/var/mail/zabbix
/var/mail/nginx
/var/mail/rpc
[root@centos6 ~]# find /var/mail/ -not \( -user root -a -user mail \)   #使用摩根定律簡寫   
/var/mail/
/var/mail/zabbix
/var/mail/nginx
/var/mail/rpc
[root@centos6 ~]#

2、find 條件權限perm

(1)find命令中的條件權限查找分為三種:

格式:find [option] [arguments] -perm MODE 精確權限匹配設置的權限
格式:find [option] [arguments] -perm /MODE 任何一類(u,g,o)對象的權限中只要能一位匹配即可
格式:find [option] [arguments] -perm -MODE 每一類對象都必須同時擁有為其指定的權限標準

(2)示例

例子1:
[root@centos6 ~]# find /var/ -type f -perm 755 -ls   #查找/var/目錄下權限為755的普通文件
1050258    4 -rwxr-xr-x   1 root     root           28 Jul 20  2009 /var/lib/cas/snippets/log
1050261    4 -rwxr-xr-x   1 root     root           49 Jul 20  2009 /var/lib/cas/snippets/sys
1050262    4 -rwxr-xr-x   1 root     root          178 Jul 20  2009 /var/lib/cas/snippets/template
1050259    4 -rwxr-xr-x   1 root     root           57 Jul 20  2009 /var/lib/cas/snippets/memory
1050263    4 -rwxr-xr-x   1 root     root           59 Jul 20  2009 /var/lib/cas/snippets/traceback
1050260    4 -rwxr-xr-x   1 root     root           32 Jul 20  2009 /var/lib/cas/snippets/modules
[root@centos6 ~]#
例子2:
[root@centos6 ~]# find /tmp/ -type f -perm +222 -ls   #查找/tmp目錄下其中一位用戶有寫權限的普通文件
6029349    4 -rw-------   1 nginx    nginx           5 Aug  6 18:24 /tmp/pulse-64i6puSV0XaK/pid
6029314    0 -rw-------   1 root     root            0 Aug  6 17:34 /tmp/yum.log
6029347    0 -rwx------   1 nginx    nginx           0 Aug  6 18:24 /tmp/orbit-nginx/bonobo-activation-register-9a6315bfd3b742666cd7967900000293.lock
6029356    4 -rw-rw-r--   1 nginx    nginx         629 Aug  6 18:24 /tmp/orbit-nginx/bonobo-activation-server-9a6315bfd3b742666cd7967900000293-ior
[root@centos6 ~]#
例子3:
[root@centos6 ~]# find /boot/ -type f -perm -111 -ls   #查找/boot/目錄下所有用戶必須有執行權限的普通文件
    22  250 -rwxr-xr-x   1 root     root       254279 Mar 22 23:59 /boot/efi/EFI/redhat/grub.efi
    18 4166 -rwxr-xr-x   1 root     root      4264528 May 11 01:32 /boot/vmlinuz-2.6.32-642.el6.x86_64

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

(0)
AleenAleen
上一篇 2016-08-16
下一篇 2016-08-16

相關推薦

  • Python函數式編程指南(四):生成器

    轉自 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html 生成器是迭代器,同時也并不僅僅是迭代器,不過迭代器之外的用途實在是不多,所以我們可以大聲地說:生成器提供了非常方便的自定義迭代器的途徑。 這是函數式編程指南的最后一篇,似乎拖了一個星期才寫好,嗯…… 轉載請注明原作者和原文地…

    Linux干貨 2015-03-09
  • AOP面向方面編程

    1.引言         軟件開發的目標是要對世界的部分元素或者信息流建立模型,實現軟件系統的工程需要將系統分解成可以創建和管理的模塊。于是出現了以系統模塊化特性的面向對象程序設計技術。模塊化的面向對象編程極度極地提高了軟件系統的可讀性、復用性和可擴展性。向對象方法的焦點在于選擇對象作為模塊的主要單元,并將對象與系統的…

    Linux干貨 2015-04-07
  • 遠程使用sshd連接不上服務器解決方案

    前些天在學習linux的時候CRT怎么也連接不上我的linux服務器了,整了半天,請教了一些高人才把這個問題解決,現在整理一下我的解決方案。 大家可以看到配置都正確但就是連不上。 通過查看得出原來是22端口拒絕~! 那么我就去查看22端口有沒有開啟 大家可以看到我的22端口也就是sshd服務并沒有開啟。 我去開啟我的sshd服務器,但是又出現了問題~! 隨后…

    Linux干貨 2016-03-28
  • 15磁盤管理

    在系統中,常見的硬盤接口有分兩類:并行的和串行的 并行: IDE: 133MB/s SCSI: 640MB/s 串行: SATA: 6Gbps SAS: 6Gbps USB: 480MB/s 存儲設備的設備文件命名方式大致為:/dev/DEV_FILE IDE: /dev/hd#  #–>0,1,2,3 SCSI,SATA,SAS…

    Linux干貨 2016-12-02
  • 馬哥教育網絡班22期+第02周課程練習

    一、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 cp:復制命令,copy的簡稱 復制選項詳解: 1、交互式復制:root用戶默認添加-i參數,普通用戶默認使用命令本身,root用戶也想使用命令本身需在命令前增加"\" [root@bogon ~]# ls /tmp/ newfil…

    Linux干貨 2016-09-02
  • Linux磁盤和文件系統管理

    Linux磁盤和文件系統管理 linux磁盤管理 一、Linux設備類型     硬盤有機械硬盤(HDD)和固態硬盤(SSD)之分。機械硬盤即是傳統普通硬盤,主要由:盤片,磁頭,盤片轉軸及控制電機,磁頭控制器,數據轉換器,接口,緩存等     幾個部分組成。  &nbs…

    Linux干貨 2016-04-11
欧美性久久久久