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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM