find命令是用于實現精確查找,實時查找指定目錄下面的文件。在工作中常用。優點是:實時,精確。缺點是:比較占用系統資源,比較慢一點。
在總結find之前,先簡單總結一下which,whereis,locate簡單用法。他們都是用于查找和定位文件的命令。
1.which命令 查找命令的二進制文件位置
例如:
[root@dxlcentOS ~]# which id
/usr/bin/id
[root@dxlcentOS ~]# which cd
/usr/bin/cd
2.whereis 文件名字的查找
選項 -b,只查找二進制文件
-m 只查找使用手冊路徑下的文件
例如:
[root@dxlcentOS ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@dxlcentOS ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
查找文件名為passwd 的文件 默認情況下使用手冊所在的章節都會查找出來。
3.locate 快速定位給定的文件名,也可以給定文件的部分名字。
常用選項:
-i 忽略大小寫
-l 輸出前幾行,例如 -l 5 輸出找到的結果前5行
-S 輸出locate使用的數據庫信息
-b 只匹配路徑中基名
-c 只統計查到的符合條件文件數量
-r 使用正則表達式
locate的優點是速度非???,但是不能實現精確查找,同時依賴于已建立的數據庫/var/lib/mlocatel里面的數據進行查找,不用搜索硬盤,所有很快。但是當你新建文件時,數據庫還沒有更新,默認是每天自動執行執行一次更新,這時候locat是無法查到的,這時候需要手動執行updatedb更新即可。
例如:
[root@dxlcentOS ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/home/dxl/passwd
[root@dxlcentOS ~]# locate -S
數據庫 /var/lib/mlocate/mlocate.db:
14,196 文件夾
82,472 文件
4,403,787 文件名中的字節數
2,007,138 字節用于存儲數據庫
find命令詳解
功能:對文進行實時,精確查找。
用法:find [OPTIONS] [查找起始路徑] [查找條件] [處理動作]
查找起始路徑:指定查找范圍,默認是當前工作目錄下進行查找
查找條件:指定查找目標的查找標準,可以根據文件名、大小、類型、從屬關系、權限等標準進行;默認為找出指定路徑下的所有文件。
處理動作:對查找出來的文件進行刪除,移動等操作,默認為輸出到屏幕上。
1.根據文件名查找:-name 可以支持glob風格文件名通配
用法:find 查找路徑 -name 文件名
例如:
[root@dxlcentOS tmp]# find . -name “*.txt” 查找/tmp目錄下所有的txt文件
./maxusers.txt
./we/dd1.txt
./we/dd2.txt
./we/dd3.txt
[root@dxlcentOS tmp]# find . -name “[A-Z]*” -print 查找當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件
./man/man3/Git.3pm.gz
./man/man3/Git::I18N.3pm.gz
[root@dxlcentOS tmp]# find . -name “f*” 查找/tmp目錄下以f開頭的文件
./functions
./fenzu
./fenz
[root@dxlcentOS tmp]# find /usr -name “[a-z][0-9]” 查找/usr目錄下以小寫字母開頭,后面跟數字0-9開頭的文件
/usr/bin/m4
/usr/share/gcc-4.8.2/python/libstdcxx/v6
2.根據文件從屬關系查找:
- -user USERNAME:查找屬主為指定用戶的所有文件。
例如:查找/var目錄下文件屬主為centos用戶的所有文件
[root@dxlcentOS tmp]# find /var -user centos
/var/spool/mail/centos
- -group GRPNAME:查找屬組為指定組的所有文件.
例如:查找 /home目錄里面屬組為nologin的文件
[root@dxlcentOS tmp]# find /home -group nologin -ls
6292165 0 drwx—— 2 nologin nologin 76 10月 20 20:55 /home/nologin
6292166 4 -rw-r–r– 1 nologin nologin 18 9月 7 00:25 /home
- -uid UID:查找屬主指定的UID的所有文件。
例如:查找/var目錄下uid為48的文件
[root@dxlcentOS tmp]# find /var -uid 48 -ls
771874 0 drwx—— 2 apache apache 6 10月 12 01:17 /var/lib/dav
17148123 0 drwx—— 3 apache apache 19 10月 12 01:17 /var/cache/httpd
- -gid GID:查找屬組指定的GID的所有文件。
例如:查找/var目錄下gid為91的文件
[root@dxlcentOS tmp]# find /var -gid 91 -ls
17133941 0 drwxr-xr-x 3 root tomcat 21 10月 13 10:30 /var/lib/tomcat
25354344 0 drwxrwxr-x 2 root tomcat 6 8月 7 12:32 /var/lib/tomcat/webapps
- -nouser:查找沒有屬主的文件。
例如:查找/home目錄里面沒有屬主的文件
[root@dxlcentOS tmp]# find /home -nouser
/home/mandriva
/home/mandriva/.bash_logout
/home/mandriva/.bash_profile
/home/mandriva/.bashrc
- -nogroup:查找沒有屬組的文件。
例如:查找/tmp目錄里面沒有屬組的文件
[root@dxlcentOS tmp]# find /tmp -nogroup -ls
16798173 0 -rw-r–r– 1 root 2050 0 10月 18 17:37 /tmp/fenz
3.根據文件的類型查找,常見的文件類型有如下
用法:find 查找路徑 -type 文件類型
f: 普通文件
d: 目錄文件
l:符號鏈接文件
b:塊設備 文件
c:字符設備文件
p:管道文件
s:套接字文件
例如: 查找/dev目錄下的所有塊設備
[root@dxlcentOS tmp]# find /dev -type b
/dev/sda6
/dev/sda5
/dev/sda4
綜合練習:
1、找出/tmp目錄下屬主為非root的所有文件;
[root@dxlcentOS tmp]# find . ! -user root -ls 方法一:用!號表示非
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we
[root@dxlcentOS tmp]# find . -not -user root -ls 方法2:加-not,表示非
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we
2、找出/tmp目錄下文件名中不包含fstab字符串的文件;
[root@dxlcentOS tmp]# find . -name “fstab” 先找出帶fstab字符的文件
./fstab
./fstab222
[root@dxlcentOS tmp]# find . ! -name “fstab“
3、找出/tmp目錄下屬主為非root,而且文件名不包含fstab字符串的文件;
[root@dxlcentOS tmp]# find . ! -name “fstab” ! -user root -ls
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we
組合條件:邏輯表達式
-a 與:前后條件要通時滿足,find默認為這個選項
-o: 或者
!,-not:非
4.根據指定的文件的大小查找
-size [+|-]指定文件的大小
常用單位有:k(千字節), M(兆字節), G(1024M字節)
1G=1024M=1024K
例如:我要在某目錄查找并指定為10k的文件,有三種輸入方式表示三種不同的查找結果
10k:查找到的結果為大于9k,小于或等10k的文件
-10k:查找大于0小于10k的文件
+10k:查找大于大于10k的文件
查找/var目錄下,查找深度到 2級子目錄,大于11k的文件 [root@dxlcentOS etc]# find /var -maxdepth 2 -size +11k -type f -exec ls -lh {} \; -rw-r--r--. 1 root root 585K 10月 28 10:32 /var/log/lastlog -rw-rw-r--. 1 root utmp 131K 10月 28 10:32 /var/log/wtmp .........
5.根據時間戳查找:就是根據文件的修改時間,訪問時間,文件屬性改變時間來查找文件。
1.以“天”為單位: find 查找目標 -atime [+|-]n
:[#, #-1)
-#:(#, 0]
“4” :4天前的那一天,表示查找第5天00:00到23.59分59秒創建的文檔
“-4” :表示查找小于等于過去4天內的文檔
“+4” :查找大于等于過去5天的文件
查找/var目錄內過去4天內的修改過的文件 [root@dxlcentOS etc]# find /var -mtime -4 -exec ls -rlt {} \;
以“分鐘”為單位:
-amin
-mmin
-cmin
6.根據權限查找:
-perm [/|-]mode
- mode:精確權限匹配,按給出的權限進行精確查找
例如: [root@dxlcentOS dir3]# find . -perm 646 -exec ls -l {} \; -rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
- /mode:權限前加斜線,任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足,權限之間存在“或”關系。
例如:要查找權限位的其他人有寫權限的文件, [root@dxlcentOS dir3]# find . -perm /002 -exec ls -l {} \; -rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt -rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt [root@dxlcentOS dir3]# find . -perm /222 -exec ls -l {} \; 查找任何有寫入權限的文件 總用量 0 -rw-r--rw-. 1 root root 0 10月 28 12:58 ddd.txt drwxr-xr-x. 2 root root 38 10月 28 13:00 dir1 .......... 說明:第一個實例/002,表示只對其他用戶的權限位的寫權限進行查找。 002就是不進行屬主和屬組的權限位進行查找的意思。 但是在centos6上面有區別,centos6上/002也可以用+002表示,centos7上面find不再使用+號。 centos6上/002表示任意權限位存在寫入的都會找到
- -mode:每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即滿足,權限之間存在“與”關系。
例如 [root@dxlcentOS dir3]# find . -perm -664 -exec ls -l {} \; -rw-rw-rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
處理動作:對find查找出的的結果進行的一列處理,例如刪除,復制等。
- -print:輸出至標準輸出;默認的動作
- -ls:類似于對查找到的文件執行“ls -l”命令,輸出文件的詳細信息;
- -delete:刪除查找到的文件;
- -fls /PATH/TO/SOMEFILE:把查找到的所有文件的長格式信息保存至指定文件中;
- ok COMMAND {} ; :對查找到的每個文件執行由COMMAND表示的命令;每次操作都由用戶進行確認;
- -exec COMMAND {} ; :對查找到的每個文件執行由COMMAND表示的命令;
注意:find傳遞查找到的文件路徑至后面的命令時,是先查找出所有符合條件的文件路徑,并一次性傳遞給后面的命令;
但是有些命令不能接受過長的參數,此時命令執行會失敗;另一種方式可規避此問題:
find | xargs COMMAND
xargs命令通俗來講就是將標準輸入轉成各種格式化的參數,所以命令[command 1] | xargs [command 2]就是將command 1的標準輸出結果,通過管道|變成xargs的標準輸入,然后xargs再將此標準輸入變成參數,傳給[command 2]。這樣一來,通過xargs命令,我們便可以在管道后面使用那些不接收標準輸入的命令了。例如[command 1]|xargs ls。
練習:
1、查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄;
[root@dxlcentOS dir3]# find /var -user root -group mail -ls
8446487 0 drwxrwxr-x 2 root mail 260 10月 29 11:48 /var/spool/mail
9436072 4 -rw——- 1 root mail 680 10月 29 11:48 /var/spool/mail/root
2、查找/usr目錄下不屬于root, bin或hadoop的所有文件或目錄;用兩種方法;
[root@dxlcentOS dir3]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls 注意小括號前后的空格 [root@dxlcentOS dir3]# find /usr -not -user root -not -user bin -not -user hadoop -ls
3、查找/etc目錄下最近一周內其內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄;
~]# find /etc -mtime -7 -a -not ( -user root -o -user hadoop ) -ls
~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
4、查找當前系統上沒有屬主或屬組,且最近一周內曾被訪問過的文件或目錄;
[root@dxlcentOS dir3]# find / ( -nouser -o -nogroup ) -atime -7 -ls
82 0 drwx—— 2 1006 distro 62 10月 3 17:35 /home/mandriva
4215538 0 drwx—— 2 we55 2050 76 10月 24 11:33 /home/we55
4215539 4 -rw-r–r– 1 we55 2050 18 9月 7 00:25 /home/we55/.bash_logout
……..
5、查找/etc目錄下大于1M且類型為普通文件的所有文件;
~]# find /etc -size +1M -type f -exec ls -lh {} ;
6、查找/etc目錄下所有用戶都沒有寫權限的文件;
~]# find /etc -not -perm /222 -type f -ls
7、查找/etc目錄至少有一類用戶沒有執行權限的文件;
~]# find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它用戶有寫權限的所有文件;
~]# find /etc -perm -113 -type f -ls
- ~] # find /test ! -name “test” -type d -prune -o -type f -name “*.txt” -print
查找/test下的.txt的普通文件,不查找子目錄。- ~] # find . ! -name “.” -type d -prune -o -type f -print
查找當前目錄下的普通文件,不查找子目錄。
-maxdepth<目錄層級>:設置最大目錄層級; -mindepth<目錄層級>:設置最小目錄層級,設定查找目標的目錄查找層級,有利于加快查找速度。
例如:查找/etc一級目錄下的所有txt文件,不查找子目錄里面的文件。
-prune 排除指定某個不要進行查找的目錄
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88120
非常感謝老師后期對作業有錯漏的地方批改修正。