快速尋找文件
locate 將文件系統(tǒng)里的所有文件名壓縮成數(shù)據(jù)庫(kù),以迅速找到匹配類 shell 通配字符的文件名,不必實(shí)際查找整個(gè)龐大的目錄結(jié)構(gòu),這個(gè)數(shù)據(jù)庫(kù),通常是在半夜通過 cron,在具有權(quán)限的工作中執(zhí)行 updatedb 建立.locate 對(duì)用戶來說有其必要性,它可以回答用戶:系統(tǒng)管理者究竟將要查找的 syx 放在何處?
locate syx
缺乏通配字符模式時(shí),locate 匯報(bào)稿含有將參數(shù)作為子字符串的文件;這里找到 48 個(gè)匹配的文件.
由此可見 locate 的輸出量可能極大,他通常會(huì)通過管道丟給分頁(yè)程序(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)樗鼤?huì)將被限制訪問的目錄下的文件名泄露給用戶.如果考慮到這一點(diǎn),只需要簡(jiǎn)單的將 updatedb 的操作交給一般用戶權(quán)限執(zhí)行:這么一來,不合法的用戶便無從得知原本就不該讓它知道的文件名了.不過比較好的方式是使用 secure locate 包:slocate,他也會(huì)將文件的保護(hù)與所有權(quán)存儲(chǔ)在數(shù)據(jù)庫(kù)里,但只顯示用戶可以訪問的文件名.
updatedb 提供選項(xiàng),課件里文件系統(tǒng)里選定位置的 locate 數(shù)據(jù)庫(kù),例如用戶的根目錄樹狀結(jié)構(gòu),所以 locate 可用作個(gè)人文件的查詢.
尋找命令存儲(chǔ)位置
偶爾你也可能會(huì)想知道,調(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í)就會(huì)用到 find 命令.
如果你需要在整個(gè)目錄樹狀結(jié)構(gòu)分支里繞來繞去去尋找某個(gè)東西,find 可以幫助你完成此工作.
find 命令
語(yǔ)法:
find [files-or-directories] [options]
用途:
尋找與制定名稱模式匹配于或具有給定屬性的文件
主要選項(xiàng)
選項(xiàng) | 用途 |
---|---|
-atime n | 選定 n 天前訪問的文件 |
-ctime n | 選定 n 天前改過 inode 的文件 |
-follow | 接著符號(hào)性連接 |
-group g | 選定組 g 內(nèi)的文件(g 為用戶組 ID 名稱或數(shù)字) |
-links n | 選定擁有 n 個(gè)直接鏈接的文件 |
ls | 產(chǎn)生類似 ls 冗長(zhǎng)形式的列表,而不知有文件名. |
-mtime n | 選定 n 天前修改過的文件 |
-name ‘pattern’ | 選定文件名與 shell 通配字符模式匹配的文件(通配字符模式會(huì)使用括號(hào)框起來,可避免 shell 解釋) |
-perm mask | 選定與制定八進(jìn)制權(quán)限掩碼匹配的文件 |
-prune | 不想下遞歸目錄樹狀結(jié)構(gòu)里 |
-size n | 選擇大小為 n 的文件 |
-type t | 選定類型 t 的文件,類型施丹旖字母:d 為目錄,l 為符號(hào)性連接. |
-user u | 選定用戶 u 擁有的文件(u 為用戶的 ID 名稱或編號(hào)) |
行為: find 向下深入目錄樹狀結(jié)構(gòu),尋找所有在這些目錄樹下的文件.接下來,應(yīng)用其命令行選項(xiàng)所定義的選定器,選擇文件攻進(jìn)一步操作,通常是顯示他們的名稱,或產(chǎn)生類似 ls 的冗長(zhǎng)列出.
find 不同于 ls 與 shell 的地方時(shí):他沒有隱藏文件的概念,也就是說:就算是點(diǎn)號(hào)開頭的文件名,find 還是能找到他.
另一點(diǎn)不同于 ls 的地方時(shí):當(dāng) find 處理的是目錄時(shí),他會(huì)自動(dòng)遞歸深入目錄結(jié)構(gòu),需找在那之下的任何東西,除非你使用-prune 選項(xiàng)要求不這么做.
當(dāng) find 找到文件,他會(huì)先執(zhí)行命令行選項(xiàng)所設(shè)置的選項(xiàng)限制,如果這些測(cè)試成功,則將名稱交給內(nèi)部的操作程序處理.默認(rèn)操作是將名稱打印在標(biāo)準(zhǔn)輸出上,不過如果使用-exec 選項(xiàng),則可提供命令模板,在其中名稱可以被替換,并再執(zhí)行該命令.
在選定的文件上自動(dòng)執(zhí)行命令是很強(qiáng)的功能.單頁(yè)極度危險(xiǎn).如果該命令具有破壞性,那么最好是讓 find 先將列表產(chǎn)生在臨時(shí)性文件中,再有可勝任的人小心的確認(rèn),決定是否將命令進(jìn)一步自動(dòng)化處理.
使用 find 進(jìn)行破壞性目的的 shell 腳本,在編寫時(shí)必須格外小心,之后,也必須徹底執(zhí)行調(diào)試,例如在破壞性命令開始前插入 echo,這么一來你可以看看會(huì)有哪些操作,而不必真的執(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
$ find -iname mycprogram.c
./mycprogram.c
./MyCProgram.c
./backup/mycprogram.c
./backup/MyCProgram.c
$find / -name passwd
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
在root目錄及其一層深的子目錄中查找 passwd
$find / -maxdepth 2 -name passwd
/etc/passwd
在第二層子目錄和第四層子目錄之間查找 psswd 文件:
$find / -mindepth 3 -maxdepth 5 -name passwd
/etc/pam.d/passwd
/usr/bin/passwd
$find -maxdepth 1 -not -iname "mycprogram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c
對(duì)查找到的文件執(zhí)行特定的命令
對(duì)當(dāng)前目錄及其子目錄下文件名為”test.c”,文件名不區(qū)分大小寫執(zhí)行’rm(刪除)’操作:
$find -iname test.c -exec rm {} \
;
查找空文件
查找當(dāng)前目錄及其子目錄下的所有空文件:
$find -empty
查找當(dāng)前目錄(不包括其子目錄)下的空文件:
$find -maxdepth 1 -empty
查找只有文件所有者有讀寫權(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