『學了就忘』Linux基礎命令 — 30、find命令詳細說明

繁華似錦Fighting發表於2021-11-08

1、find命令的基本資訊

  • 命令名稱:find
  • 英文原意:search for files in a directory hierarchy
  • 所在路徑:/bin/find
  • 執行許可權:所有使用者。
  • 功能描述:在目錄中搜尋檔案。

find命令格式:

[root@localhost ~ # find 搜尋路徑 [選項] 搜尋內容

選項:
  -name:按照檔名搜尋
  -iname:按照檔名搜尋,不區分檔名大小寫
  -inum:按照inode號搜尋

2、find命令基本使用

# 1.find命令基本使用
# 按照檔名搜尋
[root@192 ~]# find . -name abcde
./abcde

# 提示:搜尋位置越大,消耗系統資源越多。
# 在生產伺服器上搜尋的時候,儘量不在根目錄下搜尋,把搜尋的範圍儘量控制在最小。

# 2.-iname
[root@192 ~]# find . -iname abcde
./ABCDE
./abcde

# 提示:i表示忽略的意思,就是忽略大小寫。

# 3.-inum

# 之前我們通過檔名可以檢視到檔案的i節點號
[root@192 ~]# ls -i abcde 
1043285 abcde

# 這裡通過find命令的-inum選項可以實現,通過i節點號檢視檔案的名字。
[root@192 ~]# find . -inum 1043285
./abcde

# 這兩個是一對命令,記憶比較方便。

擴充套件:
之前我們說過,硬連線是非常不好識別連結,原始檔和硬連結檔案只是引用計數增加了,其他資訊是無法識別的。如下:

[root@192 ~]# ls -il abcde /tmp/abcde_h 
1043285 -rw-r--r--. 2 root root 0 12月 30 18:24 abcde
1043285 -rw-r--r--. 2 root root 0 12月 30 18:24 /tmp/abcde_h

我們可以看到硬連線檔案和原始檔的i節點號是一樣的。我們可以通過i節點號來查詢是否有多個檔案與之對應。Linux系統中是一個檔案對應一個i節點號,如果有多個檔案對應一個i節點號,說明存在硬連線關係。

[root@192 ~]# find / -inum 1043285
find: “/proc/39609/task/39609/fd/5”: 沒有那個檔案或目錄
find: “/proc/39609/task/39609/fdinfo/5”: 沒有那個檔案或目錄
find: “/proc/39609/fd/5”: 沒有那個檔案或目錄
find: “/proc/39609/fdinfo/5”: 沒有那個檔案或目錄
/tmp/abcde_h
/root/abcde

我們可以看到,通過上邊這種方式是可以確定兩個檔案是硬連結關係。但是我們在平時使用Linux系統的時候,還是不推薦建立檔案的硬連結。

補充:上邊程式碼塊的前4行是干擾項。這是在整個根目錄搜尋的時候,會搜尋到proc目錄,而proc目錄是記憶體,find命令在執行的時候,就會消耗一定的記憶體資源,這4行就是find命令在執行時產生的臨時檔案。同時這種臨時檔案找到也是立刻消失的,所以會出現每行最後的“沒有那個檔案或目錄”

3、按照檔案大小搜尋

[root@localhost ~]# find 搜尋路徑 [選項] 搜尋內容

選項:
  -size[+|-]大小:按照指定大小搜尋檔案

提示:這裡的+的意思是搜尋比指定大小還要大的檔案,-的意思是搜尋比指定大小還要小的檔案。

(1)find 命令的單位:

[root@localhost ~ ] # man find
    -size n[cwbkMG]
        File uses n units of space.The following suffixes can be used:

        #這是預設單位,如果單位為b或不寫單位,則按照512 Byte搜尋。
        ' b':for 512-byte blocks(this is the default if no suffix is used)

        #搜尋單位是c,按照位元組搜尋。
        'c':for bytes

        #搜尋單位是w,按照雙位元組(中文)搜尋。
        'w':for two-byte words

        #按照KB單位搜尋,必須是小寫的k。
        'k':for Kilobytes(units of 1024 bytes)

        #按照MB單位搜尋,必須是大寫的M
        'M':for Megabytes(units of 1048576 bytes)

        #按照GB單位搜尋,必須是大寫的G
        ' G':for Gigabytes(units of 1073741824 bytes)

(2)示例:

# 1.檢視root目錄下檔案資訊
[root@DevOps ~]# ll -h
總用量 48K
-rw-r--r--. 1 root root   17 1月   9 17:08 abc
-rw-------. 1 root root 1.3K 12月 23 20:46 anaconda-ks.cfg
-rw-r--r--. 1 root root  28K 12月 23 20:46 install.log
-rw-r--r--. 1 root root 7.4K 12月 23 20:45 install.log.syslog

# 2.在當前目錄下搜尋檔案大小為28k的檔案
[root@DevOps ~]# find . -size 28k
./install.log

# 3.在當前目錄下搜尋檔案大小大於1k的檔案。
[root@DevOps ~]# find . -size +1k
.
./install.log
./anaconda-ks.cfg
./install.log.syslog

# 注意:具體單位字母看上邊列表。

# 4.注意一個小問題
# 如果按檔案大小搜尋,並且檔案的大小沒有寫單位,預設是按b(位元組)進行查詢的,但是我們可以看到下面並沒有查詢處abc檔案。

[root@DevOps ~]# ll -h
總用量 48K
-rw-r--r--. 1 root root   17 1月   9 17:08 abc
-rw-------. 1 root root 1.3K 12月 23 20:46 anaconda-ks.cfg
-rw-r--r--. 1 root root  28K 12月 23 20:46 install.log
-rw-r--r--. 1 root root 7.4K 12月 23 20:45 install.log.syslog
[root@DevOps ~]# find . -size 17
[root@DevOps ~]# 

# 原因是:
# 看上邊的單位說明` ' b':for 512-byte blocks(this is the default if no suffix is used)`
# 說b預設單位是按照512byte查詢,這是一個預設的屬性值,如上邊我們輸入的17,就是17*512b的結果進行計算,然後進行查詢。
# `c`是按照位元組搜尋。

[root@DevOps ~]# find . -size 17c
./abc

4、按照修改時間搜尋

Linux中的檔案有訪問時間(atime資料修改時間(mtime狀態修改時間(ctime這三個時間,我們也可以按照時間來搜尋檔案。

注意:如果以time結尾的時間單位,預設單位時間是天。

命令格式如下:

[root@localhost ~ ] # find 搜尋路徑 [選項] 搜尋內容

選項:
  -atime[+|-]時間:按照檔案訪問時間搜尋
  -mtime[+|-]時間:按照檔案資料修改時間搜尋
  -ctime[+|-]時間:按照檔案狀態修改時間搜尋

提示:也有-amin-mmin等時間選項,時間單位為分鐘。

mtime資料修改時間來舉例,重點說說+-時間的含義。

我們畫一個時間軸,來解釋一下,如下圖:

image

說明:

  • -5:代表5天內修改的檔案。
  • 5:代表前5~6天,那一天修改的檔案。
  • +5:代表6天前修改的檔案。

5、按照許可權搜尋

命令格式如下:

[root@localhost ~]# find 搜尋路徑 [選項] 搜尋內容

選項:
  -perm: 許可權模式:查詢檔案許可權剛好等於“許可權模式”的檔案
  -perm: -許可權模式:查詢檔案許可權全部包含“許可權模式”的檔案
  -perm: +許可權模式:查詢檔案許可權包含“許可權模式”的任意一個許可權的檔案

舉例:

# 1.檢視資料夾內容
[root@DevOps test]# ll
總用量 0
-rw-r--r--. 1 root root 0 1月   9 18:17 abc
-rw-r--r--. 1 root root 0 1月   9 18:17 def

# 2.按照許可權查詢檔案
[root@DevOps test]# find . -perm 644
./def
./abc

# 注:644代表許可權rw-r--r--

# 3.修改檔案def許可權為600,然後進行+、-查詢
[root@DevOps test]# chmod 600 def 
[root@DevOps test]# ll
總用量 0
-rw-r--r--. 1 root root 0 1月   9 18:17 abc
-rw-------. 1 root root 0 1月   9 18:17 def

# 查詢
[root@DevOps test]# find . -perm +444
.(代表當前目錄不用考慮)
./def
./abc
[root@DevOps test]# find . -perm -444
.
./abc
[root@DevOps test]# 

說明:

  • 如果是+,代表所有者,所屬組,其他人這三個許可權中,只要有一個許可權大於搜尋的許可權,就能夠找到該許可權。
  • 如果是-,代表三個許可權都要滿足每項許可權,如abc檔案的許可權是644,每個許可權全都大於444,所以被搜尋到。
  • 總結:+就是三個許可權滿足一個即可,-三個全滿足才可以。

提示:find的許可權搜尋,能理解就好,+-工作中一般用不太多。

6、按照所有者和所屬組搜尋

命令格式如下:

[root@localhost ~]# find 搜尋路徑 [選項] 搜尋內容

選項:
  -uid 使用者ID:按照使用者ID查詢所有者是指定ID的檔案
  -gid組ID:按照使用者組ID查詢所屬組是指定ID的檔案
  -user使用者名稱:按照使用者名稱查詢所有者是指定使用者的檔案
  -group組名:按照組名查詢所屬組是指定使用者組的檔案
  -nouser:查詢沒有所有者的檔案

舉例:

# 按照所有者查詢檔案
[root@DevOps test] # find . -user root
.
./def
./abc

提示:

  • (重要)上邊這種方式並不常用,在按照所有者和所屬組搜尋時,-nouser選項比較常用,主要用於查詢垃圾檔案。
  • (重要)只有一種情況例外,那就是外來檔案。比如光碟和U盤中的檔案如果是由Windows複製來的(也就是檔案是由Windows建立的),在Linux中檢視就是沒有所有者的檔案;再比如手工原始碼包安裝的檔案,也有可能沒有所有者(由其他系統打的原始碼包)。
  • 除了外來檔案,Linux系統下所有的檔案都應該有所有者,否則至少是一個垃圾檔案。是需要使用者來處理掉的。

而關於所有者和所屬組搜尋常用的命令為:

[root@DevOps test] # find / -nouser
find: “/proc/5244/task/5244/fd/5”: 沒有那個檔案或目錄
find: “/proc/5244/task/5244/fdinfo/5”: 沒有那個檔案或目錄
find: “/proc/5244/fd/5”: 沒有那個檔案或目錄
find: “/proc/5244/fdinfo/5”: 沒有那個檔案或目錄

注意:這四行之前說過,是find命令在執行時,在記憶體中自己產生的臨時檔案,執行完既消失。
上邊命令結果證明Linux系統中沒有垃圾檔案。

7、按照檔案型別搜尋

命令格式如下:

[root@localhost ~]# find 搜尋路徑 [選項] 搜尋內容

選項:
  -type d:查詢目錄
  -type f:查詢普通檔案
  -type l:查詢軟連結檔案

舉例

# 查詢當前檔案中的目錄
[root@DevOps ~]# find . -type d
.
./test

# 其他選項同理。

8、邏輯運算子

find命令支援一些複雜的搜尋方式:邏輯與、邏輯或、邏輯非

命令格式如下:

[root@localhost ~]# find 搜尋路徑 [選項] 搜尋內容

選項:
  -a:and邏輯與
  -o:or邏輯或
  -not:not 邏輯非

(1)-a:and邏輯與

find命令也支援邏輯運算子選項,其中-a代表邏輯與運算,也就是-a的兩個條件都成立,find搜尋的結果才成立(其中有一個不成立都不行)。

舉個例子:

# 在當前目錄下搜尋大於2KB,並且檔案型別是普通檔案的檔案
[root@localhost ~]# find . -size +2k -a -type f

(2)-o:or邏輯或

-o選項代表邏輯或運算,也就是-o的兩個條件只要其中一個成立,find命令就可以找到結果。

舉個例子:

# 在當前目錄下搜尋檔案要麼是cangls的檔案,要麼是bols的檔案,兩個都可以搜尋到。 
[root@localhost ~]# find . -name cangls -o -name bols
./cang1s
./bols

(3)-not:not 邏輯非

not是邏輯非,也就是取反的意思。

舉個例子:

# 在當前目錄下搜尋檔名不是cangls的檔案
[root@localhost ~]# find . -not -name cangls

# 下面!的寫法和上邊-not是一個意思,都是邏輯非運算子。
[root@localhost ~]# find . ! -name cangls

# (注意!左右兩邊都有要空格)

9、其他選項

這裡我們主要講解兩個選項-exec-ok,這兩個選項的基本作用非常相似。

我們先來看看-exec選項的格式。

(1)-exec選項

[root@localhost ~]# find 搜尋路徑 [選項] 搜尋內容 -exec 命令2 {} \;

說明:

  1. 基本格式,只要寫-exec,命令最後一定要寫\;
  2. 作用是,把命令1的搜尋結果(find 搜尋路徑 [選項] 搜尋內容),作為命令2的操作物件。(其實可以理解成把命令1的操作結果,放在命令2後邊的{ }中,然後用命令2去搜尋{ }中的內容。)
  3. 在命令2種不識別別名,就是在命令2種不能用別名,如果ll命令。

(2)-ok選項

-ok選項和-exec選項的作用基本一致,區別在於:-exec的命令2會直接處理,而不詢問;-ok的命令2在處理前會先詢問使用者是否這樣處理,在得到確認命令後,才會執行。

示例如下:

# 在刪除自己產生的一些零時檔案,且很久不用的時候,可以用下面命令刪除。
[ root@ localhost ~] # find /var/log -mtime +10 -ok rm -rf 0\; 
〈 rm.../var/log/samba/old〉?n
〈 rm.../var/log/sssd〉?n
〈 rm...I/var/log/ntpstats〉?n
〈 rm.../var/log/cups〉?n

相關文章