linux 命令與文件的搜尋

1,which (尋找運行命令)

[root@www ~]# which [-a] command選項或參數:-a :將所有由 PATH 目錄中可以找到的命令均列出,而不止第一個被找到的命令名稱範例一:分別用root與一般帳號搜尋 ifconfig 這個命令的完整檔名
[root@www ~]# which ifconfig
/sbin/ifconfig            <==用 root 可以找到正確的運行檔名喔!
[root@www ~]# su - vbird<==切換身份成爲 vbird 去!
[vbird@www ~]$ which ifconfig
/usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
:/home/vbird/bin)         <==見鬼了!竟然一般身份帳號找不到!# 因爲 which 是根據使用者所配置的 PATH 變量內的目錄去搜尋可運行檔的!所以,# 不同的 PATH 配置內容所找到的命令當然不一樣啦!因爲 /sbin 不在 vbird 的 # PATH 中,找不到也是理所當然的啊!了乎?
[vbird@www ~]$ exit<==記得將身份切換回原本的 root範例二:用 which 去找出 which 的檔名爲何?
[root@www ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot '
        /usr/bin/which
# 竟然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥?# 那就是所謂的『命令別名』,意思是輸入 which 會等於後面接的那串命令啦!# 更多的數據我們會在 bash 章節中再來談的!範例三:請找出 cd 這個命令的完整檔名
[root@www ~]# which cd
/usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin
:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
# 瞎密?怎麼可能沒有 cd ,我明明就能夠用 root 運行 cd 的啊!

這個命令根據(PATH)這個環境變量所規範的路徑,去搜尋運行檔的檔名,所以,重點是找出運行檔而已!而which後接的是(完整!檔名)!若加上-a 選項,則可以列出所有的可以找到的同名運行檔,而非僅顯示第一個而已

2文件搜尋

find這個命令不怎麼常用,因爲速度慢而且很傷硬盤!通常我們都用whereis 或者是 locate來搜尋,如果找不到繼續使用find來搜尋!前面兩個之所以速度快,是因爲他們利用數據庫來搜尋數據,,並沒有實際搜尋硬盤!

a whereis (尋找特定文件)


[root@www ~]# whereis [-bmsu] 文件或目錄名選項與參數:-b    :只找 binary 格式的文件-m    :只找在說明檔 manual 路徑下的文件-s    :只找 source 來源文件-u    :搜尋不在上述三個項目當中的其他特殊文件範例一:請用不同的身份找出 ifconfig 這個檔名
[root@www ~]# whereis ifconfig 
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@www ~]# su - vbird       <==切換身份成爲 vbird
[vbird@www ~]$ whereis ifconfig<==找到同樣的結果喔!
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[vbird@www ~]$ exit             <==迴歸身份成爲 root 去!# 注意看,明明 which 一般使用者找不到的 ifconfig 卻可以讓 whereis 找到!# 這是因爲系統真的有 ifconfig 這個『文件』,但是使用者的 PATH 並沒有加入 /sbin# 所以,未來你找不到某些命令時,先用文件搜尋命令找找看再說!範例二:只找出跟 passwd 有關的『說明文件』檔名(man page)
[root@www ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

b locate

[root@www ~]# locate [-ir] keyword選項與參數:-i  :忽略大小寫的差異;-r  :後面可接正規表示法的顯示方式範例一:找出系統中所有與 passwd 相關的檔名
[root@www ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
....(底下省略)....

locate使用非常簡單,直接在後面輸入(文件部分名稱)就能夠得到結果,據上面的例子來說,輸入locate passwd ,那麼在完整檔名(包含路徑名稱)當中,只要passwd在其中,就會被顯示出來!如果忘記文件全名就可以使用這個。

但是這個命令也有限制 ,locate尋找的數據是由(已創建的數據庫 /var/lib/mlocate/)裏面的數據搜尋到的,所以不用直接去硬盤裏存取數據。所以當你創建了一個文件之後想要使用locate查詢時,必須先要更新數據庫。updatedb。命令回去讀取/etc/updatedb.con f這個配置檔的配置。然後去 硬盤裏搜尋,最後升級整個數據庫。


find


[root@www ~]# find [PATH] [option] [action]選項與參數:1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明   -mtime  n :n 爲數字,意義爲在 n 天之前的『一天之內』被更動過內容的文件;   -mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的文件檔名;   -mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的文件檔名。   -newer file :file 爲一個存在的文件,列出比 file 還要新的文件檔名範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的文件列出
[root@www ~]# find / -mtime 0# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,# 有變動過內容的文件都會被列出來!那如果是三天前的 24 小時內?# find / -mtime 3 有變動過的文件都被列出的意思!範例二:尋找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@www ~]# find /etc -newer /etc/passwd# -newer 用在分辨兩個文件之間的新舊關係是很有用的!

時間參數聽有意思,現在知道了atime ctime mtime 的意思 ,如果你想找出一天內被更改過得文件,可以使用上述範例一的做法,但是如果想找出4天內被更動過的文檔檔名呢?,那就可以使用 find /var-mtime 4 。 有沒有加上 + - 差別很大!

  • +4代表大於等於5天前的檔名:ex> find /var -mtime +4

  • -4代表小於等於4天內的文件檔名:ex> find /var -mtime -4

  • 4則是代表4-5那一天的文件檔名:ex> find /var -mtime 4

你可以在 /var/ 目錄下搜尋一下,感受一下輸出文件的差異喔!再來看看其他 find 的用法吧!

選項與參數:2. 與使用者或羣組名稱有關的參數:   -uid n :n 爲數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在            /etc/passwd 裏面與帳號名稱對應的數字。這方面我們會在第四篇介紹。   -gid n :n 爲數字,這個數字是羣組名稱的 ID,亦即 GID,這個 GID 記錄在            /etc/group,相關的介紹我們會第四篇說明~   -user name :name 爲使用者帳號名稱喔!例如 dmtsai    -group name:name 爲羣組名稱喔,例如 users ;   -nouser    :尋找文件的擁有者不存在 /etc/passwd 的人!   -nogroup   :尋找文件的擁有羣組不存在於 /etc/group 的文件!                當你自行安裝軟件時,很可能該軟件的屬性當中並沒有文件擁有者,                這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。範例三:搜尋 /home 底下屬於 vbird 的文件
[root@www ~]# find /home -user vbird# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有文件時,# 就可以利用這個命令將屬於某個使用者的所有文件都找出來喔!範例四:搜尋系統中不屬於任何人的文件
[root@www ~]# find / -nouser# 透過這個命令,可以輕易的就找出那些不太正常的文件。# 如果有找到不屬於系統任何人的文件時,不要太緊張,# 那有時候是正常的~尤其是你曾經以原始碼自行編譯軟件時。

選項與參數:3. 與文件權限及名稱有關的參數:   -name filename:搜尋文件名稱爲 filename 的文件;   -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個 SIZE 的規格有:                   c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB                   還要大的文件,就是『 -size +50k 』   -type TYPE    :搜尋文件的類型爲 TYPE 的,類型主要有:一般正規文件 (f),                   裝置文件 (b, c), 目錄 (d), 連結檔 (l), socket (s),                    及 FIFO (p) 等屬性。   -perm mode  :搜尋文件權限『剛好等於』 mode 的文件,這個 mode 爲類似 chmod                 的屬性值,舉例來說, -rwsr-xr-x 的屬性爲 4755 !   -perm -mode :搜尋文件權限『必須要全部囊括 mode 的權限』的文件,舉例來說,                 我們要搜尋 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,                 當一個文件的權限爲 -rwsr-xr-x ,亦即 4755 時,也會被列出來,                 因爲 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。   -perm +mode :搜尋文件權限『包含任一 mode 的權限』的文件,舉例來說,我們搜尋                 -rwxr-xr-x ,亦即 -perm +755 時,但一個文件屬性爲 -rw-------                 也會被列出來,因爲他有 -rw.... 的屬性存在!範例五:找出檔名爲 passwd 這個文件 [root@www ~]# find / -name passwd# 利用這個 -name 可以搜尋檔名啊!範例六:找出 /var 目錄下,文件類型爲 Socket 的檔名有哪些? [root@www ~]# find /var -type s# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的文件,# 例如 socket 與 FIFO 文件,可以用 find /var -type p 或 -type s 來找!範例七:搜尋文件當中含有 SGID 或 SUID 或 SBIT 的屬性 [root@www ~]# find / -perm +7000 # 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,# 所以當然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個權限,# 因此,就是 +7000 ~了乎?

選項與參數:4. 額外可進行的動作:   -exec command :command 爲其他命令,-exec 後面可再接額外的命令來處理搜尋到                   的結果。   -print        :將結果列印到螢幕上,這個動作是默認動作!範例八:將上個範例找到的文件使用 ls -l 列出來~
[root@www ~]# find / -perm +7000 -exec ls -l {} \;# 注意到,那個 -exec 後面的 ls -l 就是額外的命令,命令不支持命令別名,# 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!範例九:找出系統中,大於 1MB 的文件
[root@www ~]# find / -size +1000k# 雖然在 man page 提到可以使用 M 與 G 分別代表 MB 與 GB,# 不過,俺卻試不出來這個功能~所以,目前應該是僅支持到 c 與 k 吧!

如果你要找的文件是具有特殊屬性的,例如 SUID 、文件擁有者、文件大小等等,那麼利用 locate 是沒有辦法達成你的搜尋的!此時 find 就顯的很重要啦!另外,find 還可以利用萬用字節來找尋檔名呢!舉例來說,你想要找出 /etc 底下檔名包含 httpd 的文件,那麼你就可以這樣做:

[root@www ~]# find /etc -name '*httpd*'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章