find命令基礎講解

目錄

   前言

find命令

查找條件

   指定搜索層級

   根據文件名和inode查找

   根據屬名屬主查找

   根據文件類型查找

   組合條件

   根據文件大小查找

   根據時間戳查找

   根據權限查找

   動作處理

   參數替換xargs

擴展

   基於數據庫的查找locate

前言

我們的操作系統都是由千千萬萬個文件組成的,當我們訪問某個文件時,如果是在windows操作系統下,由於此操作系統對文件明名後綴的定義的功能十分嚴格,所以我們很容易就能在Windows下找到我們所需要的文件。即便是文件過於錯綜複雜,我們依舊可以在圖形化的Windows下通過固定的文件後綴查找我們所需要的文件。

但是在linux下情況不是那麼樂觀,因爲在linux下對文件名後綴是沒有要求的,文件可以是任何後綴名,這對執行或瀏覽並沒有任何問題。這也就造成了文件查找的不便,但是有一點好處是,在linux下有很多查找工具,我們可以藉助工具鎖定文件的某一特性進行查找,這裏面的我們要說一說“find”命令。

find是一種實時查找工具,它可以通過便利指定路徑完成文件的查找,它的特點是:查找速度略慢,精確查找,實時查找,只能搜索用戶具備讀取和執行權限的目錄

 

find命令

   格式:find [option] [查找路徑] [查找條件] [處理動作]

         查找路徑:指定具體路徑,默認爲當前目錄

查找條件:指定查找標準,可以是文件名,大小,類型,權限等,默認爲找出指定路徑下的所有文件

處理動作:對符合條件的文件操作,默認輸出到屏幕

查找條件

指定搜索層級

   我們在查找文件時,知道文件並不是放在某個很層級很多的目錄中,此時我們可以限定搜索的層級,在一定的層級範圍內所搜我們想要查找的文件。

   -maxdepth level 最大搜索目錄深度,指定目錄爲第1

-mindepth level 最小搜索目錄深度

[root@CT71 etc]#find -maxdepth 3 | less
……
./fonts/conf.d/65-0-lohit-marathi.conf
./fonts/conf.d/59-liberation-mono.conf
./fonts/conf.d/66-ucs-miscfixed.conf
./fonts/conf.d/59-liberation-sans.conf
./fonts/conf.d/60-open-sans.conf
./fonts/conf.d/10-scale-bitmap-fonts.conf
./fonts/conf.d/65-0-madan.conf
./fonts/conf.d/20-unhint-small-vera.conf
……
[root@CT71 etc]#find -mindepth 4 | less
./pki/ca-trust/extracted/README
./pki/ca-trust/extracted/java
./pki/ca-trust/extracted/java/README
./pki/ca-trust/extracted/java/cacerts
./pki/ca-trust/extracted/openssl

根據文件名和inode查找

同時,我們如果知道文件名或inode號,還可以通過文件名或inode號查找查找。

-name "文件名稱":支持使用glob(通配符):*, ?, [], [^]

-iname "文件名稱":不區分字母大小寫

-inum n inode號查找

-samefile name 相同inode號的文件

-links n 鏈接數爲n的文件

-regex 支持正則 默認爲(emacs標準)

   -regextype egrep -regex 支持egrep同標準的正則

[root@CT71 etc]#find -name "fstab"
./fstab

[root@CT71 etc]#ll -i fstab
67160130 -rw-r--r--. 1 root root 595 Jul 11 18:42 fstab
[root@CT71 etc]#find -inum 67160130
./fstab

[root@CT71 app]#find -samefile tty1
./tty1
./tty2

[root@CT71 app]#ll -i
total 8
67 -rw-r--r--. 2 root root 6 Aug  8 09:01 tty1
67 -rw-r--r--. 2 root root 6 Aug  8 09:01 tty2

[root@CT71 app]#find -links 2
.
./tty1
./tty2

[root@CT71 app]#find -regextype egrep -regex ".*\.txt$"
./lianxi_123.txt

根據屬主、屬組查找

-user USERNAME:查找屬主爲指定用戶(UID)的文件

-group GRPNAME: 查找屬組爲指定組(GID)的文件

-uid UserID:查找屬主爲指定的UID號的文件

-gid GroupID:查找屬組爲指定的GID號的文件

-nouser:查找沒有屬主的文件

-nogroup:查找沒有屬組的文件

 

[root@CT71 app]#find / -user Tom
/home/Tom
/home/Tom/.mozilla
/home/Tom/.mozilla/extensions
/home/Tom/.mozilla/plugins
/home/Tom/.bash_logout
/home/Tom/.bash_profile
/home/Tom/.bashrc

[root@CT71 app]#find /home/ -group Tom
/home/Tom
/home/Tom/.mozilla
/home/Tom/.mozilla/extensions
/home/Tom/.mozilla/plugins
/home/Tom/.bash_logout

[root@CT71 app]#find /home/ -uid 1002
/home/Tony
/home/Tony/.mozilla
/home/Tony/.mozilla/extensions
/home/Tony/.mozilla/plugins
/home/Tony/.bash_logout
/home/Tony/.bash_profile 

根據文件類型查找

-type TYPE:

f : 普通文件

d: 目錄文件

l: 符號鏈接文件

s:套接字文件

b: 塊設備文件

c: 字符設備文件

p: 管道文件

[root@CT71 app]#find / -type l | less
/dev/disk/by-label/CentOS\x207\x20x86_64
/dev/disk/by-uuid/2016-12-05-13-52-39-00
/dev/disk/by-uuid/8c59579c-30fb-417a-9fd2-cc0dd58d261e
/dev/disk/by-uuid/0292b8be-15bb-4b5a-87e3-01519be7c6de
......

[root@CT71 app]#find / -type b | less
/dev/sda5
/dev/sda4
/dev/sda3
/dev/sda2
/dev/sda1
/dev/sda
/dev/sr0

組合條件

   與:-a

或:-o

非:-not!

 

摩根定律:

   (!A)-o(!B) == ! (A –a B)

   (!A)-a(!B) == ! (A –o B)

示例:

find -user joe -not -group joe

find -user joe -o -user jane  

find -not \( -user joe -o -user jane \)

find / -user joe -o -uid 500

 

find ./ -path './dir0*' -a -prune -o -name *.txt -print

命令行的意思是:如果目錄dir0存在(即-a左邊爲真),則求-prune的值,-prune 返回真,‘與’邏輯表達式爲真(即-path './dir0*' -a -prune 爲真),find命令將在除這個目錄以外的目錄下查找txt後綴文件並打印出來;如果目錄dir0不存在(即-a左邊爲假),則不求值-prune ,‘與’邏輯表達式爲假,則在當前目錄下查找所有txt後綴文件。

 

在我的機器上,我想查找在根下既所有者即不是root也不是Tom的文件

[root@CT71 ~]#find / ! \( -user root -o -user Tom \) -ls
 23114    0 drwxr-xr-x   2 qemu     qemu            0 Aug  9 20:25 /dev/hugepages/libvirt/qemu
 15970    0 dr-xr-xr-x   9 dbus     dbus            0 Aug  9 20:24 /proc/551
 16438    0 dr-xr-xr-x   4 dbus     dbus            0 Aug  9 20:24 /proc/551/task
 16439    0 dr-xr-xr-x   6 dbus     dbus            0 Aug  9 20:24 /proc/551/task/551
 16440    0 dr-xr-xr-x   2 dbus     dbus            0 Aug  9 20:24 /proc/551/task/551/attr
 49617    0 dr-xr-xr-x   6 dbus     dbus            0 Aug 10 08:40 /proc/551/task/560
 49745    0 dr-xr-xr-x   2 dbus     dbus            0 Aug 10 08:40 /proc/551/task/560/attr
 49583    0 dr-xr-xr-x   6 dbus     dbus            0 Aug 10 08:40 /proc/551/net
 49603    0 dr-xr-xr-x   2 dbus     dbus            0 Aug 10 08:40 /proc/551/attr
 16132    0 dr-xr-xr-x   9 polkitd  polkitd         0 Aug  9 20:24 /proc/565
 51727    0 dr-xr-xr-x   8 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task
 51765    0 dr-xr-xr-x   6 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/565
 51797    0 dr-xr-xr-x   2 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/565/attr
 51766    0 dr-xr-xr-x   6 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/622
 51874    0 dr-xr-xr-x   2 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/622/attr

在上面的試驗中,我們有需要注意的地方,那就是括號,我們需要給它進行轉譯,否則,find命令無法識別。還有就是括號內兩側要留空格,不然不能使用。後面的-ls是我們在下面會說到的動作處理。在這裏我們先使用一下,-ls的作用是列出文件的信息。

根據文件大小來查找

   -size [+|-]#UNIT

   常用單位:k, M, Gcbyte

      #UNIT: (#-1, #]如:6k 表示(5k,6k]

      -#UNIT[0,#-1]如:-6k 表示[0,5k]

      +#UNIT(#,)如:+6k 表示(6k,) 

[root@CT71 bin]#find /var -size +10M
/var/lib/rpm/Packages
/var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
/var/cache/yum/x86_64/7/base/gen/filelists_db.sqlite
/var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
/var/cache/yum/x86_64/7/updates/gen/filelists_db.sqlite
[root@CT71 app]#ll -h
total 33M
-rw-r--r--. 1 root root 4.5M Aug 10 08:57 vm
-rw-r--r--. 1 root root  27M Aug 10 08:58 vmA
[root@CT71 app]#find -size 5M  ----------------------------------------------- 找大於4M小於5M的文件
./vm
[root@CT71 app]#find -size 27M  ----------------------------------------------- 找大於26M小於27M的文件
./vmA
[root@CT71 app]#ll  vmA
-rw-r--r--. 1 root root 28307124 Aug 10 08:58 vmA  ----------------------------------- 27M = 28311522k
[root@CT71 app]#

根據時間戳查找

根據時間戳:

以“天”爲單位;

-atime [+|-]#,

#: [#,#+1)

+#: [#+1,]

-#: [0,#)

-mtime

-ctime

以“分鐘”爲單位:

-amin

-mmin

-cmin

我們要查找某一天的文件,就是指從某一天的凌晨到這一天結束前的文件,我們也可以在時間後面加上其他條件,以增加查找的精度。

[root@CT71 app]#touch date{1..7}.txt
[root@CT71 app]#ll
total 0
-rw-r--r--. 1 root root 0 Aug 10 09:10 date1.txt
-rw-r--r--. 1 root root 0 Aug 10 09:10 date2.txt
-rw-r--r--. 1 root root 0 Aug 10 09:10 date3.txt
-rw-r--r--. 1 root root 0 Aug 10 09:10 date4.txt
-rw-r--r--. 1 root root 0 Aug 10 09:10 date5.txt
-rw-r--r--. 1 root root 0 Aug 10 09:10 date6.txt
-rw-r--r--. 1 root root 0 Aug 10 09:10 date7.txt
[root@CT71 app]#touch -t 201708071231 date3.txt 
[root@CT71 app]#stat date3.txt 
  File: ‘date3.txt’
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d    Inode: 69          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2017-08-07 12:31:00.000000000 +0800
Modify: 2017-08-07 12:31:00.000000000 +0800
Change: 2017-08-10 09:11:31.127117025 +0800
 Birth: -
[root@CT71 app]#touch -t 201708071131 date4.txt 
[root@CT71 app]#stat date4.txt 
  File: ‘date4.txt’
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d    Inode: 70          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2017-08-07 11:31:00.000000000 +0800
Modify: 2017-08-07 11:31:00.000000000 +0800
Change: 2017-08-10 09:12:50.962118411 +0800
 Birth: -
-----------------------------------------------------------------------------------------

[root@CT71 app]#find . -atime 2
./date3.txt
./date4.txt

我們查找到了兩天以前訪問過的文件,但是不包括第二天,也就是從三天前的凌晨到第二天之前的文件。上面是使用的atime做的實驗,換成mtime或者amin效果是一樣的,這裏就不在做過多的演示。

根據權限查找

-perm [/|-]MODE

MODE: 精確權限匹配

/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關係

+ centos7開始淘汰

-MODE:每一類對象都必須同時擁有指定權限,與關係

0 表示不關注

   示例:

      find -perm 755 會匹配權限模式恰好是755的文件

只要當任意人有寫權限時, find -perm +222就會匹配

只有當每個人都有寫權限時, find -perm -222纔會匹配

只有當其它人(other)有寫權限時, find -perm -002纔會匹配

 

首先是精確匹配權限:

[root@CT71 etc]#find . -perm 400 -ls
496877    4 -r--------   1 root     root           45 Jul 11 18:44 ./openldap/certs/password
[root@CT71 etc]#find . -perm 000 -ls
69022747    4 ----------   1 root     root         1044 Aug  7 18:48 ./gshadow
69022742    4 ----------   1 root     root         2053 Aug  7 18:48 ./shadow
67160186    4 ----------   1 root     root         1054 Aug  7 18:47 ./gshadow-
67557582    4 ----------   1 root     root         2177 Aug  7 18:47 ./shadow-

然後是,只要ugo任何一位任何一種權限可以匹配得上就可以:我們可以看到匹配到的文件在u位上都有r權限

[root@CT71 etc]#find . -perm /400 -ls | less

67160129   12 drwxr-xr-x 133 root     root         8192 Aug 10 07:51 .
67160130    4 -rw-r--r--   1 root     root          595 Jul 11 18:42 ./fstab
67160131    0 -rw-------   1 root     root            0 Jul 11 18:42 ./crypttab
67160132    0 lrwxrwxrwx   1 root     root           17 Aug  9 20:19 ./mtab -> /proc/self/mounts
67160171    4 -rw-r--r--   1 root     root           70 Aug 10 07:51 ./resolv.conf
33554510    0 drwxr-xr-x   3 root     root           38 Jul 11 18:44 ./fonts
67160164    8 drwxr-xr-x   2 root     root         4096 Jul 11 18:49 ./fonts/conf.d
68946978    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:49 ./fonts/conf.d/65-0-lohit-marathi.conf -> /usr/share/fontconfig/conf.avail/65-0-lohit-marathi.conf
67337313    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-mono.conf -> /usr/share/fontconfig/conf.avail/59-liberation-mono.conf
68946986    0 lrwxrwxrwx   1 root     root           54 Jul 11 18:49 ./fonts/conf.d/66-ucs-miscfixed.conf -> /usr/share/fontconfig/conf.avail/66-ucs-miscfixed.conf
67337328    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-sans.conf -> /usr/share/fontconfig/conf.avail/59-liberation-sans.conf
68946987    0 lrwxrwxrwx   1 root     root    

接下來必須匹配的權限,也就是說:我要的權限你必須的匹配得到,其他我沒有匹配到的,可以有,也可以沒有.

[root@CT71 etc]#find . -perm -466 -ls  | less

67160132    0 lrwxrwxrwx   1 root     root           17 Aug  9 20:19 ./mtab -> /proc/self/mounts
68946978    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:49 ./fonts/conf.d/65-0-lohit-marathi.conf -> /usr/share/fontconfig/conf.avail/65-0-lohit-marathi.conf
67337313    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-mono.conf -> /usr/share/fontconfig/conf.avail/59-liberation-mono.conf
68946986    0 lrwxrwxrwx   1 root     root           54 Jul 11 18:49 ./fonts/conf.d/66-ucs-miscfixed.conf -> /usr/share/fontconfig/conf.avail/66-ucs-miscfixed.conf
67337328    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-sans.conf -> /usr/share/fontconfig/conf.avail/59-liberation-sans.conf
68946987    0 lrwxrwxrwx   1 root     root           50 Jul 11 18:49 ./fonts/conf.d/60-open-sans.conf -> /usr/share/fontconfig/conf.avail/60-open-sans.conf
67337364    0 lrwxrwxrwx   1 root     root           59 Jul 11 18:44 ./fonts/conf.d/10-scale-bitmap-fonts.conf -> /usr/share/fontconfig/conf.avail/10-scale-bitmap-fonts.conf
68946990    0 lrwxrwxrwx   1 root     root           48 Jul 11 18:49 ./fonts/conf.d/65-0-madan.conf -> /usr/share/fontconfig/conf.avail/65-0-madan.conf
67337372    0 lrwxrwxrwx   1 root     root           58 Jul 11 18:44 ./fonts/conf.d/20-unhint-small-vera.conf -> /usr/share/fontconfig/conf.avail/20-unhint-small-vera.conf

動作處理

-print:默認的處理動作,顯示至屏幕

-ls:類似於對查找到的文件執行“ls -l”命令

-delete:刪除查找到的文件

-fls file:查找到的所有文件的長格式信息保存至指定文件中

-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認

-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令

{}: 用於引用查找到的文件名稱自身

find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令

動作處理很簡單啦,就是處理我們find查找到的文件進行後續的處理,接下來我們對動作處理做簡單演示

[root@CT71 etc]#find . -atime 1 -ls 
67323613   12 -rw-r--r--   1 root     root        10923 Nov  5  2016 ./pki/tls/openssl.cnf
720795    4 -rw-r--r--   1 root     root         2208 Nov 12  2016 ./ssh/ssh_config
69022755    4 -rw-r--r--   1 root     root         2914 Aug  8 21:07 ./bashrc
69022753    4 -rw-r--r--   1 root     root         1829 Aug  8 20:58 ./profile
69080768    4 -rw-r--r--   1 root     root         2015 Aug  1 16:02 ./vimrc
67160616  656 -rw-r--r--   1 root     root       670293 Jun  7  2013 ./services

  [root@CT71 etc]#find . -atime 1 -fls /app/dadas$(date +"%F")
  [root@CT71 etc]#cd /app/
  [root@CT71 app]#ll
  total 4
  -rw-r--r--. 1 root root 2193 Aug 10 09:42 dadas2017-08-10 

 [root@CT71 app]#find . -name "dat*"
 ./date1.txt
 ./date2.txt
 ./date3.txt
 ./date4.txt
 ./date5.txt
 ./date6.txt
 ./date7.txt
 [root@CT71 app]#find . -name "dat*" -ok rm {} \;
 < rm ... ./date1.txt > ? y
 < rm ... ./date2.txt > ? y
 < rm ... ./date3.txt > ? y
 < rm ... ./date4.txt > ? y
 < rm ... ./date5.txt > ? y
 < rm ... ./date6.txt > ? y
 < rm ... ./date7.txt > ? y

參數替換

由於很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令。xargs用於產生某個命令的參數, xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成爲arguments。有些命令不能接受過多參數,命令執行可能會失敗, xargs可以解決

findxargs格式: find | xargs COMMAND

示例:

ls f* |xargs rm

find /sbin -perm +7000 | xargs ls –l

[root@CT71 app]#find -name "data*" | xargs ls -li
67 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a1.txt
68 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a2.txt
69 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a3.txt
70 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a4.txt
71 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b1.txt
72 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b2.txt
73 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b3.txt
75 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b4.txt
76 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c1.txt
77 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c2.txt
78 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c3.txt
79 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c4.txt

擴展

基於數據庫的查找

locate這個命令是基於數據庫查找我們所需要的文件的,它沒有很多的參數,不能像find那樣進行基於某一方面的精確查找。使用locate查找文件,其實就是查找系統上預建的文件索引數據庫/var/lib/mlocate/mlocate.db由於它依賴於事先構建的索引,而索引的構建是在系統較爲空閒時自動進行的,所以,我們在當時新建的文件或目錄以及更新無法在當時使用locate查詢,如果想要查詢,需要手動更新數據庫(updatedb)。

   並且,索引構建過程需要遍歷整個根文件系統,及消耗資源,它有以下工作特點:

查找速度快,模糊查找,非實時查詢,搜索的是文件的全路徑不僅僅是文件名,可能只搜索用戶具備讀取和執行權限的目錄

命令:locate

選項:

   -i:不區分大小寫搜索

   -n N:只列舉前N個匹配項目

   -r:使用正則搜索

 

[root@CT71 app]#locate /etc/ -i "*shad*" | less
/etc/.pwd.lock
/etc/.updated
/etc/DIR_COLORS
/etc/DIR_COLORS.256color
/etc/DIR_COLORS.lightbgcolor
/etc/GREP_COLORS
/etc/GeoIP.conf
... ...
[root@CT71 app]#locate -r ".*a\.conf$" | less
/etc/pbm2ppa.conf
/etc/pnm2ppa.conf
/etc/abrt/abrt-action-save-package-data.conf
/etc/fonts/conf.d/20-unhint-small-vera.conf
/etc/fonts/conf.d/25-no-bitmap-fedora.conf
/etc/fonts/conf.d/65-0-lohit-kannada.conf
/etc/fonts/conf.d/65-0-lohit-oriya.conf
/etc/fonts/conf.d/65-0-smc-meera.conf
/etc/fonts/conf.d/66-sil-abyssinica.conf
/etc/java/java.conf
... ...

 

 

發佈了52 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章