鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號(hào)展開與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語(yǔ)句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)四十四天---尋找文件

快速尋找文件
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   
  1. 查找文件
$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  
  1. 查找文件,忽略文件名的大小寫
$ find -iname mycprogram.c   
./mycprogram.c  
./MyCProgram.c  
./backup/mycprogram.c  
./backup/MyCProgram.c  
  1. 指定搜索目錄的深度
    在 root 目錄及其子目錄下查找 passwd 文件:
$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  
  1. 相反匹配 顯示所有名字不是 MyCProgram.c 的文件或者目錄.由于 maxdepth 是 1,所以只會(huì)顯示當(dāng)前目錄下的文件和目錄:
$find -maxdepth 1 -not -iname "mycprogram.c"  
.  
./MybashProgram.sh  
./create_sample_files.sh  
./backup  
./Program.c  
  1. 對(duì)查找到的文件執(zhí)行特定的命令
    對(duì)當(dāng)前目錄及其子目錄下文件名為”test.c”,文件名不區(qū)分大小寫執(zhí)行’rm(刪除)’操作:
    $find -iname test.c -exec rm {} \;

  2. 查找空文件
    查找當(dāng)前目錄及其子目錄下的所有空文件:
    $find -empty
    查找當(dāng)前目錄(不包括其子目錄)下的空文件:
    $find -maxdepth 1 -empty

  3. 根據(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

  1. 查找制定類型的文件
    查找 socket 文件:
    $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