Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123196
  • 博文数量: 36
  • 博客积分: 2001
  • 博客等级: 大尉
  • 技术积分: 422
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 01:43
文章分类

全部博文(36)

文章存档

2011年(1)

2009年(2)

2008年(33)

我的朋友

分类: 系统运维

2008-05-31 12:02:11

Linux 本身的檔案目錄放置規劃方式是採用 Unix 所設計的樹狀目錄結構進行配置,當 Linux 系統安裝好後會有許多的檔案目錄依照不同的性質放置於不同目錄內。當使用者在這樣的環境進行操作時,面對系統這麼多而廣的檔案目錄,如何在快速的時間內搜 尋到自己所需要的檔案目錄呢?所以這次我們將探討 Linux 系統環境下提供檔案目錄檢索搜尋的工具程式項目。

與其他 Unix Like 作業系統一般,Linux 系統提供了與傳統 Unix 作業系統下的檔案搜尋程式,那就是 which、locate、whereis 與finde 共 4 種工具程式。不同的檔案搜尋程式的運作設計特點皆不相同,下列表格整理了 which、locate、whereis 與find 程式的特性與缺點提供簡單的比較。
程式名稱     特點    

缺點
which     依照 PATH 變數尋找搜尋可執行檔,尋找速度最快速     無法尋找特定類型檔案;程式檔案不在 PATH 變數路徑內無法進行搜尋
locate     依照事先建立的資料庫索引檔案進行任何檔案搜尋,尋找速度效益很高     定期更新索引檔案,才能夠維持索引檔案最新的資訊狀態
whereis     依據預先定義好的目錄進行尋找可執行檔案、原始碼檔案 與man page 文件檔案     搜尋使用的目錄位置固定,可能發生遺漏所預期檔案清單項目
find     依照指定條件尋找出特定的檔案目錄,功能最為強大     即時尋找,所以尋找的速度慢,磁碟I/O也會比較繁重

下面將介紹 Linux 系統下檔案搜尋工具的特點與使用方式。

which 程式
which 程式簡介
當使用者下達相關命令時,shell 程式將會先判定該命令是否為內建命令
倘若不是的話,shell 程式將會依照環境變數區的PATH 變數指定的目錄設定,逐一尋找到該執行檔案並加以執行之。若是PATH 變數內的目錄並沒有包含使用者所指定的程式名稱,系統便會告知無該命令存在。
which 程式的用途,就是搜尋使用者目前 PATH 路徑內,是否有使用者指的執行檔案,並且顯示出該執行檔完整的路徑名稱。

which 程式使用
which 程式的使用相當簡單,通常後面只要加上要尋找的執行檔案名稱即可獲得搜尋的結果。

使用方式:
which [選項] [--] 程式名稱1 程式名稱2 [...]

使用範例:
$ which startx
/usr/X11R6/bin
$ which gzip
bin/gzip
$ which abc
which: no abc in (/bin:/usr/bin:/usr/X11R6bin:/usr/local/bin)

whereis 程式
whereis 程式簡介
whereis 程式主要的設計是用來尋找系統程式檔案、原始碼與 manpage這類相關的檔案。

whereis 對於尋找的資料路徑一般是固定的,程式內部設計一般檢索的路徑如下:

/{bin,sbin,etc}
/usr/{lib,bin,old,new,local,games,include,etc,src,man
/usr/{sbin,X386,TeX,g++-include}
/usr/local/{X386,TeX,X11,include,lib,man,etc,bin,games,emacs}

whereis 程式使用
locate 程式的使用,在 locate 後面指定要尋找的檔案目錄名稱,
符合的程式檔案、原始碼檔案與 manpage項目就會搜尋並列出

使用範例:
$ whereis adduser
adduser: /usr/sbin/adduser /usr/share/man/man8/adduser.8.bz2

locate 程式
locate 程式簡介
locate 程式能夠用來尋找使用者指定的檔案與目錄,檔案目錄名稱只要
有 包含使用者所指定的字串,都是符合搜尋的條件。由於locate 本身使用了索引檔案的機制,所以能夠搜尋速度相當快。需要注意的是,因為 locate程式本身是使用索引檔案進行檔案搜尋,因此該索引檔案需要定期更新,以便於與系統檔案目錄現狀位持一致。另外一提的是,Linux 系統的 locate 程式採用的是 GNU 所開發更安全與增強功能的 slocate 程式,所以實際上使用 locate 程式時與執行 slocate 程式都是一樣的。

locate 程式本身使用的索引檔案,是位於系統 /var/lib/slocate 目錄內的
slocate.db 檔案。該檔案一般會經由系統排程的機制定期執行updatedb 程式尋找系統所有檔案目錄,加以更新 slocate.db 資料庫檔案。

locate 程式使用
locate 程式的使用,在 locate 後面指定要尋找的檔案目錄名稱,
只要檔案目錄名稱包含所指定的字串都表示符合

使用範例:
$ locate gzip
/usr/share/man/man1/gzip.1.bz2
/usr/share/doc/vim-common-6.1/doc/pi_gzip.txt
/usr/share/doc/gzip-1.2.4a
/usr/share/doc/gzip-1.2.4a/NEWS
/usr/share/doc/gzip-1.2.4a/README
/usr/share/info/gzip.info.bz2
/usr/share/pixmaps/document-icons/gnome-application-x-gzip.png
/usr/share/vim/plugin/gzip.vim
/usr/bin/gzip

find 程式
find 程式簡介
find 是一個相當強大的搜尋工具,本身提供了相當多的參數選項能夠精準的搜尋到所需要的檔案目錄,並支援格式化輸出所搜尋到的檔案目錄。
由於 find 本身是採行即時搜尋整個檔案系統的方式,因此搜尋上需要耗費較多時間,磁碟 IO 部分也會比較繁重。
find 程式執行完成後,若是有尋找到指定條件的檔案,返回值為 0,
否則為 1。
find 程式使用
find 程式的使用語法規則為:
find [/path …] [expression …]

使用範例 1:
由目前的所在目錄開始尋找所有檔案目錄
find

使用範例 2:
由指定的目錄為起始點開始尋找所有檔案目錄
find /usr/share

使用範例 3:
由多個指定的目錄為起始點開始尋找所有檔案目錄
find /etc /usr/lib

由於 find 功能相當強大,下面將依照相關功能分類解說 find 程式的使用

檔案類型:
find 程式內,可以使用 –type 指定搜尋的類型。下面列出可供使用的選項類型:

b:區塊裝置 (block)
c:字元裝置 (character)
d:目錄 (directory)
p:命名管線 (named pipe,FIFO)
f:一般檔案 (regular file)
l:符號連結檔 (symbolic link)
s:網路連結裝置檔案 (socket)

使用範例 1:
列出 /etc 目錄,所有的子目錄:
find /etc –type d

使用範例 2:
列出位於 /usr/share 目錄,所有的一般檔案:
find /etc –type f

使用範例 3:
列出位於 /bin 目錄,所有的符號連結檔案
find /bin -type l
檔案目錄名稱:
使用 find 尋找檔案時,可以透過 -name的參數選項,指定搜尋特定
目錄內,是否有指定的檔案目錄名稱。該參數支援一般 shell 的通配字元
的樣式。-name 本身是區分大小寫的,-iname 參數選項則是不區分大小寫。

使用範例 1:
搜尋 /etc 目錄內,檔案名稱為 ifcfg-eth0 的一般檔案:
find /etc -type f -name “ifcfg-eth0”

使用範例 2:
搜尋 /usr/share/man 目錄內,以 printf 開頭的一般檔案:
find /usr/share/man -type f -name “printf*”

使用範例 3:
搜尋 /usr/X11R6/bin 目錄內,名稱包含 x 或是 X 的一般檔案
find /usr/X11R6/bin -iname “*x*”

檔案大小:
使用 find 程式時,透過 -size 參數的使用,可以精準的搜尋出
特定檔案長度的檔案。-size 參數的使用,支援的單位有:

b:block (1 block = 512 byte)
c:byte
k : kbyte
w : word byte

實際在使用時,可以搭配 + 與 – 表示大於或者是小於指定的大小。

使用範例 1:
搜尋 /bin 目錄內,檔案長度為大約為 10K 的一般檔案
find /bin -type f -size 10k

使用範例 2:
搜尋 /bin 目錄內,以 a ~ m 開頭,檔案長度大於 10K 的一般檔案
find /bin -type f -name “[a-m]*” -size +10k

使用範例 3:
搜尋 /usr/bin 目錄內,檔案長度在 50k ~ 100k 範圍內的檔案
find /usr/bin -type f -size +50k –size -100k


檔案目錄權限:
使用 find 程式時,透過 -perm 參數的使用,可以搜尋出特定
權限屬性的檔案。

使用上,支援 + 與 – 的方式搜尋出特定屬性權限的檔案,
表示的意義為:
perm mode
權限屬性為 mode內任何 Bit 欄位
perm +mode
權限屬性包含 mode 內任何 Bit 欄位
perm –mode
權限屬性至少要包含 mode 內任何 Bit 欄位

使用範例 1:
搜尋 /bin 目錄內,權限為 755 的一般檔案
find /bin -type f -perm 755

使用範例 2:
搜尋 /usr/bin 目錄內,任何人都可以執行的檔案
find /bin -type f -perm -0111

使用範例 3:
搜尋 /usr 目錄與其下子目錄,權限至少為 644 的一般檔案
find /usr -type f -perm +644

使用者群組資訊:
使用 find 程式時,透過 -user、-group可以搜尋特定所屬使用者、
群組的檔案目錄。透過 -nouser、-nogroup 可以找到在系統 /etc/passwd、
/etc/group 檔案內沒有對應紀錄的檔案目錄。透過 -node 可以找出 inode
編號的檔案目錄。

使用範例 1:
以 / 目錄開始,尋找出 owner 為 root,setuid 屬性,任何人都可以執行的檔案
find / -type f -user root -perm -4111

使用範例 2:
以 /home 開始,尋找出 owner 為 peter,可執行屬性的一般檔案
find /home -type f -user peter -perm +0111

使用範例 3:
尋找整個檔案系統,列出沒有 owner 與 group 對應的孤兒清單
find / -nouser -nogroup

使用範例 4:
以 /usr 目錄開始,尋找出 inode 編號為 19011 的一般檔案
find /usr -type f -inum 19011

時間欄位:
Unix 的檔案系統上,對於檔案的建立、存取、修改等資訊都會加以
紀錄。使用 find 程式時,可以搭配 -amin、-atime、-cmin、-ctime、-mmin、-mtime 等參數選項搜尋出特定時間欄位屬性的檔案目錄。

參數意義:

-amin
檔案於幾分鐘前被存取過
-atime
檔案於幾天前被存取過
-cmin
檔案的狀態於幾分鐘前被修改過
-ctime
檔案的狀態於前幾天前被修改過
-mmin
檔案內容於幾分鐘前被修改過
-mtime
檔案內容於幾天前被修改過

參數使用支援 +、- 等項目,用來表示大於該時間區段,
或者是小於該時間區段。

使用範例 1:
搜尋 /etc 目錄,列出前一天到現在被修改過的檔案
find /etc –mtime -1

使用範例 2:
搜尋 /var/log 目錄,列出已經有 7 天以上沒有更動過的一般檔案
find /var/log -type f -mtime +7

搜尋深度:
使用 find 程式時,可以搭配 –maxdepth 指定搜尋檔案目錄時,其最大的路徑深度。

使用範例 1:
搜尋 /etc 該層目錄 (不包含其下子目錄) 內所有的一般檔案
find /etc -type f -maxdepth 1

使用範例 2:
搜尋 /usr/lib 該層目錄內,檔案附檔名為 .so ,長度大於 100k的一般檔案
find /usr/lib -type f -maxdepth 1 -size +100k

外部程式呼叫:
find 程式支援 –exec 與 –ok 參數,能夠將執行 find 得到的搜尋的結果,呼叫外部程式作為該程式的參數進行處理。
另外常與 find 程式搭配使用的還有 xargs 程式,該程式能夠將程式
透過標準輸出的訊息,轉為呼叫外部程式,並以該標準輸出的訊息,作為該
程式的命令列引數。 xargs 程式的使用,多半都是透過管線的方式呼叫執行。

使用範例 1:
以 / 目錄開始進行,搜尋檔案名稱為 core的一般檔案,然後加以刪除
find / -type f -name “core” -exec rm –f {} \;

上面範例中,{} 為代換 find 搜尋到的檔案完整路徑名稱,然後作為
rm -f 程式的引數。需要注意是,使用 –exec 參數,最後要使用 “;” 分號作為結尾字元,不過因為 shell 對於命令列上的 “;” 分號有特殊的
解釋,所以需要在 “;” 分號前面加上 “\” 反斜線,以避免 shell 解釋
“;” 為命令的區隔,find 程式也才能夠判定命令的結尾。

若搭配 -exec 參數時改用 -ok 替換,表示執行命令時會提示使用者是否確定要執行。

若是使用 xargs 使用的話,上述範例可以修改為
find / -type f -name “core” | xargs rm -f

使用範例 2:
搜尋 /home/peter 目錄,找出副檔名為 “.doc” 的一般檔案,然後使用
touch 程式將檔案時間更新到現在最新時間
find /home/pter -type f -name “*.doc” -exec touch {} \;

上面範例,也可以使用 xargs 程式達成
find /home/pter -type f -name “*.doc” | xargs touch

結論:看完上面的介紹部分,您是否對於 Linux 系統環境上要尋找檔案目錄更有進一步的了解了呢?在下一期我們要介紹的是在 Linux 環境的檔案目錄壓縮與打包的處理方式,讓大家了解如何在 Linux 系統上進行檔案備份與還原。
阅读(1374) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~