find詳解(Blog 2)

find與locate特性、find命令

find 文件查找工具

\ > Linux資深運維工程師必會文件查找工具之一

查找:在文件系統上,按某種條件,查找符合條件的文件;并非是文本內容過濾(grep)

文件系統:倒置的樹狀結構;管理文件;

文件:有邊界的在磁盤上的一段流式數據;

linux上文件查找工具實現:locate, find

locate工具:根據事先構建的索引庫查找;

  • 速度快:查找數據庫完成;類似whatis查找方式;
  • 模糊查找:文件系統中的某個路徑中存在此字串即符合;
  • 非實時查找:查找到的內容只能是構建數據庫那一刻之前所有的內容;

\ > 查找時性能好,但構建索引庫需要遍歷整個根文件系統,極消耗資源;


locate命令使用:

locate [OPTION]… PATTERN…


-b 僅匹配路徑中的基名;
-c, --count: 統計顯示符合條件的文件數量
-r, --regexp REGEXP:使用BRE編寫模式;
  • 搜索文件系統上passwd文件;
    ~]# locate -b -r "^passwd$" 
    /etc/passwd
    /etc/pam.d/passwd
    /usr/bin/passwd
    /usr/share/bash-completion/completions/passwd                                   
    統計,以上查找文件的數目:
    ~]# updatedb

find工具:實時查找,遍歷指定起始路徑下文件系統層級結構完成文件查找

  • 速度略慢:在用戶給定的指定目錄下進行遍歷查找
  • 精確查找:匹配路徑的基名;且精確匹配;
  • 實時查找:查找文件是此刻文件的狀態;

ps:現在硬件越強,查找精確性足以抵消查找速度降低的時間。

find命令使用:

find [OPTION]… [查找起始路徑] [查找條件] [處理動作]


  • OPTION: -maxdepth:查找指定起始路徑下的路徑深度;
  • 查找起始路徑:指定具體搜索目標起始路徑;默認為當前目錄;
  • 查找條件:指定查找標準;默認找出指定路徑下所有文件;(目錄也是文件)
  • 處理動作:對符合條件的文件做出的操作;默認顯示至標準輸出;

查找條件:

文件名:

基名匹配: glob

 -name "GLOB"
 -iname "GLOB"

完整路徑名匹配: REGEX

-regex "PATTERN"
-iregex "PATTERN"

查找/etc起始路徑下passwd的所有文件;

[root@localhost ~]# find /etc -name "passwd"
/etc/passwd
/etc/pam.d/passwd

查找文件系統下包含shadow的所有文件:

[root@localhost ~]# find / -regex ".*shadow.*"
/usr/share/doc/shadow-utils-4.1.5.1/NEWS

從屬關系:

查找屬主為指定用戶的所有文件;

-user USERNAME

屬組為指定組

-group GROUPNAME

查找屬主為指定UID的所有文件;

-uid UID

屬組為指定UID

-gid GROUPID

沒有屬主的所有文件;

-nouser

沒有屬組的所有文件;

-nogroup

查找/tmp目錄下屬主為centos的所有文件:

[root@localhost ~]# find /tmp -user centos

查找/tmp目錄下屬組為fedora的所有文件;

[root@localhost ~]# find /tmp -group fedora

查找/tmp目錄下屬主為502的所有文件:

[root@localhost ~]# find /tmp -uid 502

查找/tmp目錄下屬組為520的所有文件:

[root@localhost ~]# find /tmp -gid 520

查找文件系統沒有屬主的所有文件:

[root@localhost ~]# find / -nouser

查找文件系統沒有屬組的所有文件:

[root@localhost ~]# find / -nogroup

類型:

普通文件,regular file;

-type f

目錄文件,directory;

-type d

塊設備文件,block;

-type b

字符設備文件,character;

-type c

鏈接文件,symbolic;

-type l

套接字文件,socket;

-type s

命名管道,pipe(name);

-type p

查找/tmp目錄下所有目錄文件;

[root@localhost ~]# find /tmp -type d

查找/etc目錄下所有符號鏈接文件;

[root@localhost ~]# find /etc -type l

查找/dev目錄下所有塊設備;

[root@localhost ~]# find /dev -type b

組合:

與:-a,默認組合邏輯;同時滿足條件才滿足;


或:-o,被查找的文件,只要二者符合其中之一,即可滿足條件;與-ls連用,需要將或的整體加 (A -o B)


非:-not, !


組合條件遵循“摩根定律”:


查找文件系統下不是root用戶的所有文件:

[root@localhost ~]# find / ! -user root

查找文件系統下不是mygrp組的所有文件:

[root@localhost ~]# find / ! -group mygrp -ls

查找文件系統下不是root用戶,且不是mygrp組的所有文件:

[root@localhost ~]# find / ! -user root -a ! -group mygrp -ls
可以寫作:[root@localhost ~]# find / ! \( -user root -o -group mygrp \) -ls

查找文件系統下沒有屬組或屬主的所有文件:

[root@localhost ~]# find / \( -nogroup -o -nouser \) -ls 
[root@localhost ~]# find / -nogroup -o -nouser -ls
注意:加括號匹配整體,不加括號只匹配-nouser條件;

找出/tmp目錄下屬主為非root,而且文件名不包含fstab字符串的文件;

[root@localhost ~]# find /tmp -not \(  -user root -o  -name "passwd" \) -ls

根據文件大小查找:

精確查找;(#-1,#]

-size #[KMG]

小于指定值[0,#-1]

-size -#[KMG]

大于指定值(#,+無窮)

-size +#[KMG]

查找/tmp目錄下為1k的所有文件

[root@localhost ~]# find /tmp -size 1k -ls
注意:對應目錄下文件不足1k也會顯示

根據時間戳查找:以”天”為單位:

距離現在有#天; (#+1,#]

-atime # 或 -mtime #

-#: 距離現在小于#天;(#,至今]

-atime -# 或 -mtime -#

+#: 距離現在大于#天:(負無窮,#+1]

-atime +# 或 -mtime +#

查找/tmp目錄下7天內訪問過所有文件:

[root@localhost ~]# find /tmp -atime -7 -ls

根據時間戳查找:以”分鐘”為單位:

距離現在有#分鐘; (#+1,#]

-amin # 或 -mmin #

-#: 距離現在小于#分鐘;(#,至今]

-amin # 或 -mmin -#

+#: 距離現在大于#分鐘:(負無窮,#+1]

-amin # 或 -mmin +#

24小時(86400秒)內修改過:

# find /etc -mtime -1

查找/tmp目錄下30分鐘內修改過的所有文件;

[root@localhost ~]# find /tmp -mmin -30 -ls

根據權限查找:

至少為此權限;

-perm -MODE

滿足三類用戶的一位權限,即可;

-perm /MODE 
666: rw-rw-rw- 表示:屬主有r或w即滿足,屬組有r或w即滿足,其他有r或w即滿足
\> r--------: 屬主有r,滿足;
\> ----w----: 屬組有w,滿足;

精確匹配;

-perm MODE

查找/etc目錄下都有執行權限的普通文件;

[root@localhost ~]# find /etc -perm -111 -a -type f

查找/etc目錄下都沒有執行權限的目錄:

[root@localhost ~]# find /etc ! -perm  /111 -a -type d -ls

查找/etc目錄下至少有一類用戶有寫權限的所有文件;

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

查找/etc目錄下至少有一類用戶沒有寫權限的所有文件;

[root@localhost ~]# find /etc ! -perm  -222  -ls

處理動作:

-print:默認動作;顯示輸出至標準輸出;

[root@localhost ~]# find
[root@localhost ~]# find -print

-ls: 類似于對查找到的文件執行”ls -l”命令,輸出文件的詳細信息;

注意:或條件時僅顯示ls前的條件;
[root@localhost ~]# find /tmp  \( -nouser -o -nogroup \)  -ls

-delete: 刪除查找到的文件;

[root@localhost ~]# find /tmp  \( -nouser -o -nogroup \)  -delete

-fls /PATH/TO/SOMEFILE: 把查找到的所有文件的長格式信息保存至指定文件中;

[root@localhost ~]# find /  \( -nouser -o -nogroup \)  -fls /root/find.fls

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

[root@localhost ~]# find /  \( -nouser -o -nogroup \)  -ok rm {} \;
< rm ... /home/fedora > ? y
rm: cannot remove ‘/home/fedora’: Is a directory

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

{} 引用找到的每一行(文件的文件名)
\; 固定格式
    # find . -perm -002 -exec mv {} {}.danger \;
    注意:find傳遞查找到的文件路徑至后面的命令時,是先查找出符合條件的文件路徑,并一次性傳遞給后面的命令;
    但有些命令不能接受過長的參數,此時命令執行會失敗,另一種方式可規避此問題;
    find | xargs -I {} COMMAND {}

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

# find /var -user root -a -group mail

2、查找/usr目錄下不屬于root, bin或hadoop的所有文件或目錄;用兩種方法;

# find /usr -not \( -user root -o -user bin -o -user hadoop \)
# find /usr -not -user root -a ! -user bin -a ! -user hadoop

3、查找/etc/目錄下最近一周內其內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄;

# find /etc -mtime -7 -a ! -user root -a ! -user hadoop

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

# find / -nouser -o -nogroup -a -atime -7

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

# find /etc -size +1M -a -type f -exec ls -lh {} \;

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

# find /etc ! -perm /222 -a -type f
    都有:-222
    都沒有:加否定,且變或! /222

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

# find /etc ! -perm -111 -a type f
    至少有一類用戶有執行:/111
    加否定,或變且:! -111

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

# find /etc/init.d -perm -113 -a -type f

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88251

(1)
逆神陽逆神陽
上一篇 2017-11-07 15:02
下一篇 2017-11-08 19:09

相關推薦

  • 文本處理工具命令使用以及文件權限管理

    一 sort uniq wc cut tr 等文本處理工具的基本用法 1. 通過who命令查看當前登錄了哪些用戶,并通過uniq或sort -u命令將重復的行只顯示一次 [root@Linuxprobe ~]# who | cut -d’ ‘ -f1 | sort -u 目前查看系統有兩個用戶登錄 harrycai root [root@Linuxprobe…

    Linux干貨 2017-08-13
  • LVS的簡介和配置

    lvs分為3種模式 :1:lvs-nat:本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發(1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP(2)請求報文和響應報文都必須經由Director轉發,Director易于成為系統瓶頸(3)支持端口映射,可修改請求報文的目…

    2017-10-23
  • sed簡介及常見用法

    sed是一個文本流處理器,配合正則表達式用可以實現很多文本處理操作。 和grep一樣,sed是一行一行的處理的。sed處理文本時,首先會將源文件復制一份到內存中,然后將文本一行一行拿到模式空間內進行操作,最后輸出到標準輸出,即屏幕上。 在模式空間中,每一行都會根據用戶給的條件進行匹配,匹配到了進行編輯后輸出,沒有匹配到,直接輸出到標準輸出。sed除了模式空間…

    2018-01-04
  • OpenStack Icehouse私有云實戰部署

    前言 相信你一定對“云主機”一詞并不陌生吧,通過在Web頁面選擇所需主機配置,即可快速定制一臺屬于自己的虛擬主機,并實現登陸操作,大大節省了物理資源。但這一過程是如何實現的呢?本文帶來OpenStack Icehouse私有云實戰部署。 OpenStack 簡介 OpenStack是由網絡主機服務商Rackspace和美國宇航局聯合推出的一個開源項目,Ope…

    Linux干貨 2015-07-29
  • LVS小記

    19.LVS小記    LVS的類型:        nat:是一種基于IP的DNAT的,通過目標端口與目標地址利用特定的算法選取出響就的主機進行響應,通過RS(Real Server)的地址和端口進行轉發            特點:&n…

    2017-05-15
  • 系統基礎之用戶,組管理作業題

    、創建testuser uid 1234,主組:bin,輔助組:root,ftp,shell:/bin/csh home:/testdir/testuser 1 2 3 [root@wen-7 ~]# useradd -u 1234 -g bin -G root,ftp&nbsp…

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