尋找文件
快速尋找文件
locate
將文件系統(tǒng)里的所有文件名壓縮成數(shù)據(jù)庫,以迅速找到匹配類 shell 通配字符的文件名,不必實(shí)際查找整個(gè)龐大的目錄結(jié)構(gòu),這個(gè)數(shù)據(jù)庫,通常是在半夜通過 cron
,在具有權(quán)限的工作中執(zhí)行 updatedb
建立。locate
對用戶來說有其必要性,它可以回答用戶:系統(tǒng)管理者究竟將要查找的 syx 放在何處?
locate syx 缺乏通配字符模式時(shí),locate
匯報(bào)稿含有將參數(shù)作為子字符串的文件;這里找到 48 個(gè)匹配的文件。
由此可見 locate
的輸出量可能極大,他通常會通過管道丟給分頁程序 (pager),如 less;或是查找過濾程序,例如 grep 處理:
$locate syx | grep syx5
通配字符模式續(xù)杯保護(hù),以避免 shell 展開,這么一來 locate
才能處理他們:$locate '*gcc-3.3*.tar*'
#在 locate 里,使用通配字符匹配,以尋找 gcc-3.3
注意:locate
或許不舍用于所有站點(diǎn),因?yàn)樗鼤⒈幌拗圃L問的目錄下的文件名泄露給用戶。如果考慮到這一點(diǎn),只需要簡單的將 updatedb
的操作交給一般用戶權(quán)限執(zhí)行:這么一來,不合法的用戶便無從得知原本就不該讓它知道的文件名了。不過比較好的方式是使用 secure locate
包:slocate
,他也會將文件的保護(hù)與所有權(quán)存儲在數(shù)據(jù)庫里,但只顯示用戶可以訪問的文件名。
updatedb
提供選項(xiàng),課件里文件系統(tǒng)里選定位置的 locate
數(shù)據(jù)庫,例如用戶的根目錄樹狀結(jié)構(gòu),所以 locate
可用作個(gè)人文件的查詢。
尋找命令存儲位置
偶爾你也可能會想知道,調(diào)用一個(gè)沒有路徑的命令時(shí),他再文件系統(tǒng)的位置如何。此時(shí)可以使用 type
命令
$type gcc #gcc 在哪?
$type type #type 是什么?
$type newgcc #newgcc 是什么?
$type mypwd #mypwd 是什么?
$type hahaha #這個(gè)不存在的命令是什么?
-bash:type:hahaha:not found
注意:type 是內(nèi)部 shell
命令,所以它認(rèn)得別名與函數(shù)。
假定你想選擇大于某個(gè)大小的文件,或是三天前修改的文件,屬于你的文件,或者擁有三個(gè)或三個(gè)以上直接鏈接的文件,此時(shí)就會用到 find
命令。
如果你需要在整個(gè)目錄樹狀結(jié)構(gòu)分支里繞來繞去去尋找某個(gè)東西,find
可以幫助你完成此工作。
find 命令
語法:
find [files-or-directories] [options]
用途:
尋找與制定名稱模式匹配于或具有給定屬性的文件
主要選項(xiàng)
選項(xiàng)
用途
-atime n
選定 n 天前訪問的文件
-ctime n
選定 n 天前改過 inode 的文件
-follow
接著符號性連接
-group g
選定組 g 內(nèi)的文件 (g 為用戶組 ID 名稱或數(shù)字)
-links n
選定擁有 n 個(gè)直接鏈接的文件
ls
產(chǎn)生類似 ls 冗長形式的列表,而不知有文件名。
-mtime n
選定 n 天前修改過的文件
-name ‘pattern’
選定文件名與 shell 通配字符模式匹配的文件 (通配字符模式會使用括號框起來,可避免 shell 解釋)
-perm mask
選定與制定八進(jìn)制權(quán)限掩碼匹配的文件
-prune
不想下遞歸目錄樹狀結(jié)構(gòu)里
-size n
選擇大小為 n 的文件
-type t
選定類型 t 的文件,類型施丹旖字母:d 為目錄,l 為符號性連接。
-user u
選定用戶 u 擁有的文件 (u 為用戶的 ID 名稱或編號)
行為:
find
向下深入目錄樹狀結(jié)構(gòu),尋找所有在這些目錄樹下的文件。接下來,應(yīng)用其命令行選項(xiàng)所定義的選定器,選擇文件攻進(jìn)一步操作,通常是顯示他們的名稱,或產(chǎn)生類似 ls
的冗長列出。find
不同于 ls
與 shell 的地方時(shí):他沒有隱藏文件的概念,也就是說:就算是點(diǎn)號開頭的文件名,find
還是能找到他。ls
的地方時(shí):當(dāng) find
處理的是目錄時(shí),他會自動遞歸深入目錄結(jié)構(gòu),需找在那之下的任何東西,除非你使用 -prune
選項(xiàng)要求不這么做。find
找到文件,他會先執(zhí)行命令行選項(xiàng)所設(shè)置的選項(xiàng)限制,如果這些測試成功,則將名稱交給內(nèi)部的操作程序處理。默認(rèn)操作是將名稱打印在標(biāo)準(zhǔn)輸出上,不過如果使用 -exec
選項(xiàng),則可提供命令模板,在其中名稱可以被替換,并再執(zhí)行該命令。find
先將列表產(chǎn)生在臨時(shí)性文件中,再有可勝任的人小心的確認(rèn),決定是否將命令進(jìn)一步自動化處理。find
進(jìn)行破壞性目的的 shell 腳本,在編寫時(shí)必須格外小心,之后,也必須徹底執(zhí)行調(diào)試,例如在破壞性命令開始前插入 echo
,這么一來你可以看看會有哪些操作,而不必真的執(zhí)行它。案例:
$touch MybashProgram.sh mycprogram.c MyCProgram.c Program.c
$mkdir backup
$cd backup
$touch MybashProgram.sh mycprogram.c MyCProgram.c Program.c
查找文件
```$find -name MyCProgram.c(保證不再 backup 目錄下)
./tmp/MyCProgram.c
./tmp/backup/MyCProgram.c
上面的命令展示了,在當(dāng)前目錄下查詢文件名為 `MyCProgram.c` 的文件。如果要指定查找目錄,例如從根目錄開始查找文件名為 `MyCProgram.c` 的文件:
```$ find / -name MyCProgram.c
/tmp/MyCProgram.c
/tmp/backup/MyCProgram.c
指定搜索目錄的深度
passwd $find / -maxdepth 2 -name passwd /etc/passwd
$find / -mindepth 3 -maxdepth 5 -name passwd /etc/pam.d/passwd /usr/bin/passwd
相反匹配
顯示所有名字不是 MyCProgram.c
的文件或者目錄。由于 maxdepth
是 1,所以只會顯示當(dāng)前目錄下的文件和目錄:
```$find -maxdepth 1 -not -iname "mycprogram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c
對查找到的文件執(zhí)行特定的命令
對當(dāng)前目錄及其子目錄下文件名為“test.c”,文件名不區(qū)分大小寫執(zhí)行'rm(刪除)'
操作:
$find -iname test.c -exec rm {} \;
查找空文件
$find -empty
$find -maxdepth 1 -empty
根據(jù)權(quán)限查找文件
文件權(quán)限在 linux 系統(tǒng)是一個(gè)很重要的概念,新建兩個(gè)文件:test.c,test1.c,權(quán)限修改為如下:
```----r----- 1 root root 0 7 月 12 20:30 test1.c
-rw------- 1 root root 0 7 月 12 20:30 test.c
- 查找只有文件所有者有讀寫權(quán)限的文件:
`$find -perm 600`
- 查找與文件所有者同用戶組的用戶具有讀權(quán)限的文件:
`$find -perm 040`
$find /tmp -type s
find /tmp -type d
find /tmp -type f
$find /tmp -type s -name ".*"
$find /tmp -type d -name ".*"
尋找問題文件
我們注意到包含特殊字符 (如換行字符) 的文件名有點(diǎn)麻煩。find
具有 -print0
選項(xiàng),以顯示文件名為 nul
終結(jié)的字符串。由于路徑名稱可包含任何字符,除了 NUl
以外,所以這個(gè)選項(xiàng),可產(chǎn)生能夠被清楚解析的文件名列表。
詳細(xì)資料:參考 http://www.jb51.net/LINUXjishu/205761.html