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
下一篇 2017-11-08

相關推薦

  • 一些鮮為人知的編程事實

    我的程序員經歷讓我明白了一些關于軟件開發的事情。下面是一些在編程中可能會讓人感到詫異的事情: 一個程序員用了大約只用了10%-20%的時間來編碼,而且大多數程序員,無論他的水平如何,其平均每天只有10-12行的代碼最終會進入最終的軟件產品中。這是因為,優秀的程序員會花費90%的時間來思考、調查、研究最佳的設計。而糟糕的程序員則會花費90%的時間來調試代碼,并…

    Linux干貨 2016-07-11
  • DNS搭建實例

      環境介紹 系統版本:CentOS 7.2 程序包:bind(提供的dns server程序、已經幾個常用的測試程序)、bind-utils(bind客戶端程序集,例如dig,host,nslookup等) 緩存名稱服務器的配置: 1、安裝程序包     ~]# yum install&…

    Linux干貨 2017-02-15
  • 網卡別名與bonding配置

    我們知道,一般來說,一個硬件地址對應與一個IP地址。但在一些情況下,我們可以通過一些方法打破硬件地址與IP地址的一一對應關系。下面就來說一下網卡別名與bonding配置。 網卡別名就是將多個IP地址綁定到一個網絡接口上,其命名方式為IFACE:num,如eth0:1等。需要注意的是,網卡別名僅對虛擬主機有效。創建網卡別名有兩種方式: 1、ifconfig命令…

    Linux干貨 2016-09-05
  • N25_第十周作業

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) POST –> BootSequence(BIOS) –>Bootloader(MBR) –>Kernel(ramdisk)–>rootfs(readonly)–>switchroot&#821…

    Linux干貨 2017-02-14
  • Linux pxe服務

                     Linux pxe服務 pex工作過程:   客戶機從自己的pxe網卡啟動,向本網絡中的DHCP服務器請求IP地址及子網掩碼,此時DHCP服務器返回分給客戶機的IP地址和子網掩碼,并告知客戶機bootstrap文件的…

    系統運維 2016-11-18
  • HDFS寫入和讀取流程

    一、HDFS HDFS全稱是Hadoop Distributed System。HDFS是為以流的方式存取大文件而設計的。適用于幾百MB,GB以及TB,并寫一次讀多次的場合。而對于低延時數據訪問、大量小文件、同時寫和任意的文件修改,則并不是十分適合。 目前HDFS支持的使用接口除了Java的還有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS…

    Linux干貨 2015-05-12
欧美性久久久久