天天看點

Linux find找你想要的

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