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

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

尋找文件

快速尋找文件

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 還是能找到他。
  • 另一點(diǎn)不同于 ls 的地方時(shí):當(dāng) find 處理的是目錄時(shí),他會自動遞歸深入目錄結(jié)構(gòu),需找在那之下的任何東西,除非你使用 -prune 選項(xiàng)要求不這么做。
  • 當(dāng) find 找到文件,他會先執(zhí)行命令行選項(xiàng)所設(shè)置的選項(xiàng)限制,如果這些測試成功,則將名稱交給內(nèi)部的操作程序處理。默認(rèn)操作是將名稱打印在標(biāo)準(zhǔn)輸出上,不過如果使用 -exec 選項(xiàng),則可提供命令模板,在其中名稱可以被替換,并再執(zhí)行該命令。
  • 在選定的文件上自動執(zhí)行命令是很強(qiáng)的功能。單頁極度危險(xiǎn)。如果該命令具有破壞性,那么最好是讓 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 
  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
  2. 查找文件,忽略文件名的大小寫
    ```$ find -iname mycprogram.c ./mycprogram.c ./MyCProgram.c ./backup/mycprogram.c ./backup/MyCProgram.c
  3. 指定搜索目錄的深度

    • 在 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
  4. 相反匹配
    顯示所有名字不是 MyCProgram.c 的文件或者目錄。由于 maxdepth 是 1,所以只會顯示當(dāng)前目錄下的文件和目錄:
    ```$find -maxdepth 1 -not -iname "mycprogram.c" . ./MybashProgram.sh ./create_sample_files.sh ./backup ./Program.c

  5. 對查找到的文件執(zhí)行特定的命令
    對當(dāng)前目錄及其子目錄下文件名為“test.c”,文件名不區(qū)分大小寫執(zhí)行'rm(刪除)'操作:
    $find -iname test.c -exec rm {} \;

  6. 查找空文件

    • 查找當(dāng)前目錄及其子目錄下的所有空文件: $find -empty
    • 查找當(dāng)前目錄 (不包括其子目錄) 下的空文件: $find -maxdepth 1 -empty
  7. 根據(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`
  8. 查找制定類型的文件
    • 查找 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