28 查找和放置系統(tǒng)文件

find

find 命令用于在一個或多個目錄樹中查找文件,搜索條件包括名稱、時間戳或大小等。
find 命令使用所有或部分名稱,或者使用其他搜索條件(比如大小、類型、文件所有者、創(chuàng)建日期或最后訪問日期)來搜索文件或目錄。最基本的 find 格式是按名稱或名稱的一部分來搜索。

ian@Z61t-u14:~/lpi103-2$ find . -name "*[1k]*"
./text10
./f1a
./backup
./backup/text1.bkp.2
./backup/text1.bkp.1
./f1
./text1

按類型查找文件

ian@Z61t-u14:~/lpi103-2$ find . -type d
../backup
ian@Z61t-u14:~/lpi103-2$ find . -type d -name "*"
../backup

安裝文件大小搜索

您還可以按文件大小進行搜索,搜索特定大小的文件 (n) 或大于 (+n) 或小于給定值 (-n) 的文件。通過使用大小上限和下限,可以找到大小在給定范圍內的文件。默認情況下,find 的 -size 選項會假設單位 “b” 表示 512 字節(jié)的數據塊。在其他選擇中,指定 “c” 表示字節(jié),或者指定 “k” 表示 kb。

ian@Z61t-u14:~/lpi103-2$ find . -size 0
./f1a./f2
ian@Z61t-u14:~/lpi103-2$ find . -size -26c -size +23c -print
./text2
./text5
./backup/text1.bkp.2
./backup/text1.bkp.1
./text1

which、type 和 whereis 命令

which 命令

可以使用 which 命令搜索您的路徑,找到在您鍵入一個命令時將執(zhí)行哪個命令(如果有)。

[ian@atticf22 ~]$ echo $PATH
 /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/ian/.local/bin:/home/ian/bin 
 [ian@atticf22 ~]$ which hello
 /usr/bin/which: no hello in (/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin: 
 /home/ian/.local/bin:/home/ian/bin) 
 [ian@atticf22 ~]$ export PATH=~/test-hello:$PATH
 [ian@atticf22 ~]$ echo $PATH
 /home/ian/test-hello:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin: 
 /home/ian/.local/bin:/home/ian/bin 
 [ian@atticf22 ~]$ which hello
 ~/test-hello/hello

which 命令顯示了一個命令在您的路徑中第一次出現的位置。如果您想知道該命令是否出現了多次,可以添加 -a 選項,例如:

[ian@atticf22 ~]$ which awk
 /usr/bin/awk 
 [ian@atticf22 ~]$ which -a awk
 /usr/bin/awk 
 /bin/awk
 [ian@atticf22 ~]$ ls -l $(which -a awk)
 lrwxrwxrwx. 1 root root 4 Jan  2  2015 /bin/awk -> gawk 
 lrwxrwxrwx. 1 root root 4 Jan  2  2015 /usr/bin/awk -> gawk 
 [ian@atticf22 ~]$ ls -ld /bin /usr/bin
 lrwxrwxrwx. 1 root root     7 Aug 16  2014 /bin -> usr/bin 
 dr-xr-xr-x. 2 root root 69632 Aug 10 10:40 /usr/bin

find 命令

find 命令就像是 Linux 系統(tǒng)上的文件搜索工具的瑞士軍刀。您可能發(fā)現有用的另外兩個功能是:它可以基于用戶或組名稱來查找文件,或者基于權限來查找文件。

 [root@atticf22 ~]# find /tmp -user ian 
 /tmp/jna-104022 
 ... 
 /tmp/hsperfdata_ian 
 /tmp/hsperfdata_ian/2390 
 /tmp/tracker-extract-files.1000 
 /tmp/.esd-1000 
 /tmp/.esd-1000/socket 
 /tmp/.X11-unix/X0 
 /tmp/.ICE-unix/1668

您還可以使用 -group 測試來按組查找文件。您可以使用 -nouser 和 -nogroup 選項找到不屬于系統(tǒng)上的任何用戶或組的文件。與其他測試一樣,您可以使用 ! 對該測試求反。

[ian@atticf22 ~]$ find -L research -maxdepth 2 -type d ! -group ian
 research/rh62/involution 
 research/rh62/programs 
 research/lost+found 
 find: ‘ research/lost+found ’ : Permission denied 
 [ian@atticf22 ~]$ ls -ld research/rh62/involution
 drwxr-xr-x. 2 500 adm 4096 Nov 10  1999 research/rh62/involution

按照權限查找文件

要按權限查找文件,可以使用 -perm 測試和類似 chmod 或 umask 命令所使用的符號表達式。您可以搜索準確的權限,但更有用的做法通常是在權限表達式前添加一個連字符作為前綴,以表明您想要設置了這些權限的文件,但并不關心其他權限。下面演示了如何查找用戶、組和每個人可執(zhí)行的文件,以及查找其他用戶無法讀取的文件的兩種不同方式。

 [ian@atticf22 ~]$ find . -maxdepth 1 -type f -perm -uga=x
 ./hello 
 [ian@atticf22 ~]$ find . -maxdepth 1 ! -perm  -o=r
 . 
 ./.ssh 
 ./.ICEauthority 
 ./.bash_history 
 ./.config 
 ... 
 ./.kde 
 ./.cache 
 [ian@atticf22 ~]$ find . -maxdepth 1 ! -perm  -0004
 . 
 ./.ssh 
 ./.ICEauthority 
 ./.bash_history 
 ./.config 
 ... 
 ./.kde 
 ./.cache

find 使用正則表達式

 [ian@atticf22 ~]$ cd /usr/include
 [ian@atticf22 include]$ find . -iregex ".*packet.*"
 ./net/if_packet.h 
 ./linux/packet_diag.h 
 ./linux/if_packet.h 
 ./netpacket 
 ./netpacket/packet.h 
 [ian@atticf22 include]$ find . -iregex ".*packet.*" ! -type d -size +1500c
 ./linux/packet_diag.h 
 ./linux/if_packet.h 
 ./netpacket/packet.h

locate 和 updatedb 命令

在每次運行 find 命令時,該命令都會搜索您指定的所有目錄。要加快運行速度,可以使用另一個命令 locate,它使用已存儲路徑信息的數據庫,而不是每次都搜索文件系統(tǒng)。

locate 命令

locate 命令搜索通常由一個計劃作業(yè)每天更新的數據庫中的匹配文件。
locate 命令與路徑名的任何部分匹配,而不只是與文件名匹配。將文件名放在單引號中,包含至少一個通配符來更準確地匹配。下例展示了如何查找包含字符串 bin/ls 的路徑,還展示了兩個使用通配符來限制輸出的示例。

[ian@attic4-cent ~]$ locate /bin/ls
 /bin/ls 
 /bin/lsblk 
 /bin/lscgroup 
 /bin/lssubsys 
 /usr/bin/lsattr 
 /usr/bin/lsb_release 
 /usr/bin/lscpu 
 /usr/bin/lsdiff 
 /usr/bin/lshal 
 /usr/bin/lslogins 
 /usr/bin/lsusb 
 /usr/bin/lsusb.py 
 [ian@attic4-cent ~]$ locate '\/bin/ls'
 /bin/ls 
 [ian@attic4-cent ~]$ locate '/bin/ls*'
 /bin/ls 
 /bin/lsblk 
 /bin/lscgroup 
 /bin/lssubsys

updatedb 命令

locate 使用的默認數據庫存儲在 /var 文件系統(tǒng)中的一個位置中,比如 /var/lib/locatedb。這個位置在使用 slocate 或 mlocate 包來提供額外的安全性或更高速度的系統(tǒng)上可能不同。您可以使用 locate -S 查找您的 locate 數據庫上的統(tǒng)計數據。

 [ian@attic4-cent ~]$ locate -S
 Database /var/lib/mlocate/mlocate.db: 
     77,143 directories 
     776,460 files 
     56,872,710 bytes in file names 
     21,074,461 bytes used to store datab

使用 updatedb 命令創(chuàng)建或更新該數據庫。該命令通常作為計劃作業(yè)每天運行。文件 /etc/updatedb.conf(或者有時候是/etc/sysconfig/locate)是 updatedb 的配置文件。要啟用每日更新,root 用戶需要編輯 /etc/updatedb.conf 并設置 DAILY_UPDATE=yes。要立即創(chuàng)建該數據庫,可以 root 身份運行 updatedb 命令。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容