find指令概述
Linux下find指令在目錄結構中搜尋檔案,并執行指定的操作。Linux下find指令提供了相當多的查找條件,功能很強大。由于find具有強大的功能,是以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統中含有網絡檔案系統( NFS),find指令在該檔案系統中同樣有效,隻你具有相應的權限。 在運作一個非常消耗資源的find指令時,很多人都傾向于把它放在背景執行,因為周遊一個大的檔案系統可能會花費很長的時間(這裡是指30G位元組以上的檔案系統)。
1.指令格式:
find pathname -options [-print -exec -ok ...]
2.指令功能:
用于在檔案樹種查找檔案,并作出相應的處理
3.指令參數:
pathname: find指令所查找的目錄路徑。例如用.來表示目前目錄,用/來表示系統根目錄。
-print:find指令将比對的檔案輸出到标準輸出。
-exec:find指令對比對的檔案執行該參數所給出的shell指令。相應指令的形式為'command' { } \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,隻不過以一種更為安全的模式來執行該參數所給出的shell指令,在執行每一個指令之前,都會給出提示,讓使用者來确定是否執行。
4.指令選項:
-name 按照檔案名查找檔案。
-perm 按照檔案權限來查找檔案。
-prune 使用這一選項可以使find指令不在目前指定的目錄中查找,如果同時使用-depth選項,那麼-prune将被find指令忽略。
-user 按照檔案屬主來查找檔案。
-group 按照檔案所屬的組來查找檔案。
-mtime -n +n 按照檔案的更改時間來查找檔案, - n表示檔案更改時間距現在n天以内,+ n表示檔案更改時間距現在n天以前。find指令還有-atime和-ctime 選項,但它們都和-m time選項。
-nogroup 查找無有效所屬組的檔案,即該檔案所屬的組在/etc/groups中不存在。
-nouser 查找無有效屬主的檔案,即該檔案的屬主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改時間比檔案file1新但比檔案file2舊的檔案。
-type 查找某一類型的檔案,諸如:
b - 塊裝置檔案。
d - 目錄。
c - 字元裝置檔案。
p - 管道檔案。
l - 符号連結檔案。
f - 普通檔案。
-size n:[c] 查找檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計。
-depth:在查找檔案時,首先查找目前目錄中的檔案,然後再在其子目錄中查找。
-fstype:查找位于某一類型檔案系統中的檔案,這些檔案系統類型通常可以在配置檔案/etc/fstab中找到,該配置檔案中包含了本系統中有關檔案系統的資訊。
-mount:在查找檔案時不跨越檔案系統mount點。
-follow:如果find指令遇到符号連結檔案,就跟蹤至連結所指向的檔案。
-cpio:對比對的檔案使用cpio指令,将這些檔案備份到錄音帶裝置中。
另外,下面三個的差別:
-amin n 查找系統中最後N分鐘通路的檔案
-atime n 查找系統中最後n*24小時通路的檔案
-cmin n 查找系統中最後N分鐘被改變檔案狀态的檔案
-ctime n 查找系統中最後n*24小時被改變檔案狀态的檔案
-mmin n 查找系統中最後N分鐘被改變檔案資料的檔案
-mtime n 查找系統中最後n*24小時被改變檔案資料的檔案
下面提供了根據這些要求查找檔案的示例。在某些指令中,錯誤(例如試圖列出你沒有讀取權限的檔案)輸出将被發送到
/dev/null
,以便我們不必檢視它。或者,我們可以簡單地以 root 身份運作以避免這個問題。
find指令循序漸進
選擇起點
使用 find,你可以選擇一個起點或從你所在的位置開始。要選擇的搜尋的起點,請在單詞 find 後輸入它。例如,find /usr 或 find ./bin 将在
/usr
目錄或目前位置下的
bin
目錄開始搜尋,而 find ~ 将在你的主目錄中開始搜尋,即使你目前位于目前檔案系統中的其他位置。
- 第一部分:查找名稱查找檔案的基本查找指令
- 第二部分:根據他們的權限查找檔案
- 第三部分:基于所有者群組的搜尋檔案
- 第四部分:根據日期和時間查找檔案和目錄
- 第五部分:根據大小查找檔案和目錄
第一部分:查找名稱查找檔案的基本查找指令
最常用的搜尋政策之一是按名稱搜尋檔案。這需要使用
-name
選項。
預設情況下,find 會顯示找到的檔案的完整路徑。如果你在指令中添加
-print
,你會看到同樣的結果。如果你想檢視與檔案相關的詳細資訊,例如:檔案的長度、權限等,你需要在你的 find指令的末尾添加
-ls
參數。
[root@www ~]# find ~/ -name test.sh
/root/test.sh
[root@www ~]# find ~/ -name test.sh -print
/root/test.sh
[root@www ~]# find ~/ -name test.sh -print -ls
/root/test.sh
33619982 4 -rwxrwxrwx 1 root root 332 May 8 09:40 /root/test.sh
#這裡由兩個-name,第一個是先找到.rpm包,第二個是找到以zip開頭的包
[root@www ~]# find / -name "*.rpm" -name "zip*"
/mnt/dvd/Packages/zip-3.0-11.el7.x86_64.rpm
通過索引節點号查找檔案,你可以通過用于維護檔案中繼資料(即除檔案内容和檔案名之外的所有内容)的索引節點來查找檔案。
[root@www ~]# find . -inum 33604465 -ls 2>/dev/null
33604465 4 -rwxrwxrwx 1 root root 1323 May 8 16:57 ./auto_change_ip.sh
第二部分:根據他們的權限查找檔案
查找權限為664的檔案
[root@www ~]# find / -perm 644 -ls | head -n 3
786497 4 -rw-r--r-- 1 root root 84 Feb 24 21:58 /boot/grub2/device.map
262210 8 -rw-r--r-- 1 root root 8068 Feb 24 21:58 /boot/grub2/i386-pc/gcry_rmd160.mod
262211 12 -rw-r--r-- 1 root root 9932 Feb 24 21:58 /boot/grub2/i386-pc/acpi.mod
查找根目錄下所有權限不是777的檔案
[root@www ~]# find / -type f ! -perm 777 | head -n 3
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
找到SUID檔案
[root@www ~]# find / -perm /u=s 2>/dev/null -ls | head -n 3
50410615 32 -rwsr-xr-x 1 root root 32008 Aug 4 2017 /usr/bin/fusermount
50671900 24 -rws--x--x 1 root root 23960 Aug 4 2017 /usr/bin/chfn
50671902 24 -rws--x--x 1 root root 23872 Aug 4 2017 /usr/bin/chsh
[root@www ~]# find / -perm /g=s -ls 2>/dev/null | head -n 3
8642 0 drwxr-sr-x 3 root systemd-journal 60 Mar 5 20:15 /run/log/journal
8643 0 drwxr-s--- 2 root systemd-journal 80 May 18 14:29 /run/log/journal/2a49177f4460454c986b78b936e2d28b
50407473 16 -r-xr-sr-x 1 root tty 15344 Jun 10 2014 /usr/bin/wall
第三部分:基于所有者群組的搜尋檔案
在下面這個指令中,我們尋找一個被稱為 nginx 的多使用者組擁有的檔案。
[root@www ~]# find / -group nginx -ls 2>null | head -2
366823 0 dr-xr-xr-x 9 nginx nginx 0 May 12 11:26 /proc/90890
388764 0 dr-xr-xr-x 3 nginx nginx 0 May 12 11:26 /proc/90890/task
查找沒有所有者或組的檔案,你可以使用如下指令所示的
-nouser
選項來查找不屬于目前系統上的任何使用者的檔案。
# find /tmp -nouser -ls
262204 4 -rwx------ 1 1016 1016 17 Feb 17 16:42 /tmp/hello
請注意,該清單顯示了舊使用者的 UID 和 GID,這清楚地表明該使用者未在系統上定義。這種指令将查找帳戶已從系統中删除的使用者建立在主目錄之外的檔案,或者在使用者帳戶被删除後而未被删除的主目錄中建立的檔案。類似地,
-nogroup
選項也會找到這樣的檔案,尤其是當這些使用者是相關組的唯一成員時。
查找具有特定檔案所有者或組的檔案,按所有者或組查找檔案也非常簡單。
[root@www ~]# find / -user root -name "*.png" -ls | head -2
17050148 0 lrwxrwxrwx 1 root root 56 Feb 24 21:52 /etc/favicon.png -> /usr/share/icons/hicolor/16x16/apps/fedora-logo-icon.png
110 20 -rw-r--r-- 1 root root 16443 Dec 17 2013 /usr/share/doc/grub2-common-2.02/font_char_metrics.png
第四部分:根據日期和時間查找檔案和目錄
按上次更新時間查找檔案
在此指令中,我們在特定使用者的主目錄中查找過去 24 小時内更新過的檔案。
[root@www ~]# find / -mtime -1 -ls | head -2
9138 0 drwxr-xr-x 2 root root 3060 May 12 09:59 /dev/char
358758 0 lrwxrwxrwx 1 root root 18 May 12 09:59 /dev/char/189:149 -> ../bus/usb/002/022
按上次更改權限的時間查找檔案
-ctime
選項可以幫助你查找在某個參考時間範圍内狀态(如權限)發生更改的檔案。以下是查找在最後一天内權限發生更改的檔案的示例:
[root@www ~]# find / -ctime -1 -ls 2>/dev/null | head -2
9138 0 drwxr-xr-x 2 root root 3060 May 12 09:59 /dev/char
358758 0 lrwxrwxrwx 1 root root 18 May 12 09:59 /dev/char/189:149 -> ../bus/usb/002/022
按上次通路的時間查找檔案
在這個指令中,我們使用
-atime
選項查找在過去兩天内通路過的本地 png檔案。
[root@www ~]# find / -name "*.png" -atime -2
/etc/favicon.png
/usr/share/pixmaps/fedora-gdm-logo.png
/usr/share/kde4/apps/kdm/themes/CentOS7/system-logo-white.png
/usr/share/kde4/apps/ksplash/Themes/CentOS7/2560x1600/logo.png
根據檔案相對于另一個檔案的時間來查找檔案
你可以使用
-newer
選項來查找比其他檔案更新的檔案。
[root@www ~]# find . -newer test -ls
33579105 4 dr-xr-x--- 6 root root 4096 May 12 12:10 .
33621474 28 -rw------- 1 root root 24731 May 12 12:10 ./.bash_history
33594625 4 -rw------- 1 root root 79 Mar 5 17:25 ./.local/share/lftp/cwd_history
沒有相應的
-older
選項,但是你可以用
! -newer
(即更舊)得到類似的結果,它們基本上一樣。
第五部分:根據大小查找檔案和目錄
大多數情況下,Linux 使用者會搜尋比標明大小要大的檔案。例如,要查找大于 1 千兆位元組的檔案,你可以使用這樣的指令,其中
+1G
表示“大于 1 千兆位元組”:
[root@www ~]# find / -size +1G -ls 2>/dev/null
4026532033 0 -r-------- 1 root root 140737486266368 May 12 11:32 /proc/kcore
33579125 4415488 -rw-r--r-- 1 root root 4521459712 Aug 27 2019 /root/CentOS-7.4-x86_64-DVD-1708.iso
按類型查找檔案
通過檔案類型找到一個檔案,你有很多選項——正常檔案、目錄、塊和字元檔案等等。以下是檔案類型選項清單:
b 塊特殊檔案(緩沖的)
c 字元特殊檔案(無緩沖的)
d 目錄
p 命名管道(FIFO)
f 正常檔案
l 符号連結
s 套接字
這裡有一個尋找符号連結的例子:
[root@www ~]# find / -type l -ls | head -2
14762 0 lrwxrwxrwx 1 root root 3 Mar 5 20:15 /dev/cdrom -> sr0
15856 0 lrwxrwxrwx 1 root root 12 Mar 5 20:15 /dev/snd/by-path/pci-0000:02:02.0 -> ../controlC0
[root@www ~]# find / -maxdepth 3 -name "*loop"
/sys/module/loop