『無慾則無求』Linux常用命令 — 27、find命令

1、find命令的基本信息

  • 命令名稱:find。
  • 英文原意:search for files in a directory hierarchy。
  • 所在路徑:/bin/find。
  • 執行權限:所有用戶。
  • 功能描述:在目錄中搜索文件。

2、按照文件名搜索

[root@localhost ~ ] # find 搜索路徑 [選項] 搜索內容
選項:
-name:按照文件名搜索
-iname:按照文件名搜索,不區分文件名大小寫
-inum:按照inode號搜索

#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數據修改時間來舉例,重點說說+-時間的含義。

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

在這裏插入圖片描述

說明:

  • -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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章