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