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
資料修改時間來舉例,重點說說+
和-
時間的含義。
我們畫一個時間軸,來解釋一下,如下圖:
說明:
-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 {} \;
說明:
- 基本格式,只要寫
-exec
,命令最後一定要寫\;
。 - 作用是,把命令1的搜尋結果(
find 搜尋路徑 [選項] 搜尋內容
),作為命令2的操作物件。(其實可以理解成把命令1的操作結果,放在命令2後邊的{ }
中,然後用命令2去搜尋{ }
中的內容。) - 在命令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