文件的搜寻
which (尋找『運(yùn)行檔』)
root@www ~]# which [-a] command 選項(xiàng)或參數(shù): -a :將所有由 PATH 目錄中可以找到的命令均列出,而不止第一個(gè)被找到的命令名稱分別用root與一般帳號(hào)搜尋 ifconfig 這個(gè)命令的完整檔名
[root@www ~]# which ifconfig /sbin/ifconfig <==用 root 可以找到正確的運(yùn)行檔名喔! [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) <==見鬼了!竟然一般身份帳號(hào)找不到! # 因?yàn)?which 是根據(jù)使用者所配置的 PATH 變量?jī)?nèi)的目錄去搜尋可運(yùn)行檔的!所以, # 不同的 PATH 配置內(nèi)容所找到的命令當(dāng)然不一樣啦!因?yàn)?/sbin 不在 vbird 的 # PATH 中,找不到也是理所當(dāng)然的啊!了乎? [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 # 竟然會(huì)有兩個(gè) which ,其中一個(gè)是 alias 這玩意兒呢!那是啥? # 那就是所謂的『命令別名』,意思是輸入 which 會(huì)等於后面接的那串命令啦! # 更多的數(shù)據(jù)我們會(huì)在 bash 章節(jié)中再來談的!請(qǐng)找出 cd 這個(gè)命令的完整檔名
[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 運(yùn)行 cd 的啊!這個(gè)命令是根據(jù)『PATH』這個(gè)環(huán)境變量所規(guī)范的路徑,去搜尋『運(yùn)行檔』的檔名~ 所以,重點(diǎn)是找出『運(yùn)行檔』而已!且 which 后面接的是『完整檔名』喔!若加上 -a 選項(xiàng),則可以列出所有的可以找到的同名運(yùn)行檔,而非僅顯示第一個(gè)而已!
最后一個(gè)范例最有趣,怎么 cd 這個(gè)常用的命令竟然找不到啊!為什么呢?這是因?yàn)?cd 是『bash 內(nèi)建的命令』啦! 但是 which 默認(rèn)是找 PATH 內(nèi)所規(guī)范的目錄,所以當(dāng)然一定找不到的啊!那怎辦?沒關(guān)系!
whereis (尋找特定文件)
[root@www ~]# whereis [-bmsu] 文件或目錄名 選項(xiàng)與參數(shù): -b :只找 binary 格式的文件 -m :只找在說明檔 manual 路徑下的文件 -s :只找 source 來源文件 -u :搜尋不在上述三個(gè)項(xiàng)目當(dāng)中的其他特殊文件請(qǐng)用不同的身份找出 ifconfig 這個(gè)檔名
[root@www ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [root@www ~]# su - vbird <==切換身份成為 vbird [vbird@www ~]$ whereis ifconfig <==找到同樣的結(jié)果喔! ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [vbird@www ~]$ exit <==回歸身份成為 root 去! # 注意看,明明 which 一般使用者找不到的 ifconfig 卻可以讓 whereis 找到! # 這是因?yàn)橄到y(tǒng)真的有 ifconfig 這個(gè)『文件』,但是使用者的 PATH 并沒有加入 /sbin # 所以,未來你找不到某些命令時(shí),先用文件搜尋命令找找看再說!只找出跟 passwd 有關(guān)的『說明文件』檔名(man page)
[root@www ~]# whereis -m passwd passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz等一下我們會(huì)提到 find 這個(gè)搜尋命令, find 是很強(qiáng)大的搜尋命令,但時(shí)間花用的很大! (因?yàn)?find 是直接搜尋硬盤,為如果你的硬盤比較老舊的話,嘿嘿!有的等!) 這個(gè)時(shí)候 whereis 就相當(dāng)?shù)暮糜昧?#xff01;另外, whereis 可以加入選項(xiàng)來找尋相關(guān)的數(shù)據(jù), 例如如果你是要找可運(yùn)行檔( binary )那么加上 -b 就可以啦! 如果不加任何選項(xiàng)的話,那么就將所有的數(shù)據(jù)列出來羅!
那么 whereis 到底是使用什么咚咚呢?為何搜尋的速度會(huì)比 find 快這么多? 其實(shí)那也沒有什么!這是因?yàn)?Linux 系統(tǒng)會(huì)將系統(tǒng)內(nèi)的所有文件都記錄在一個(gè)數(shù)據(jù)庫(kù)文件里面, 而當(dāng)使用 whereis 或者是底下要說的 locate 時(shí),都會(huì)以此數(shù)據(jù)庫(kù)文件的內(nèi)容為準(zhǔn), 因此,有的時(shí)后你還會(huì)發(fā)現(xiàn)使用這兩個(gè)運(yùn)行檔時(shí),會(huì)找到已經(jīng)被殺掉的文件! 而且也找不到最新的剛剛創(chuàng)建的文件呢!這就是因?yàn)檫@兩個(gè)命令是由數(shù)據(jù)庫(kù)當(dāng)中的結(jié)果去搜尋文件的所在啊! 更多與這個(gè)數(shù)據(jù)庫(kù)有關(guān)的說明,請(qǐng)參考下列的 locate 命令。
locate
[root@www ~]# locate [-ir] keyword 選項(xiàng)與參數(shù): -i :忽略大小寫的差異; -r :后面可接正規(guī)表示法的顯示方式找出系統(tǒng)中所有與 passwd 相關(guān)的檔名
[root@www ~]# locate passwd /etc/passwd /etc/passwd- /etc/news/passwd.nntp /etc/pam.d/passwd ....(底下省略)....這個(gè) locate 的使用更簡(jiǎn)單,直接在后面輸入『文件的部分名稱』后,就能夠得到結(jié)果。 舉上面的例子來說,我輸入 locate passwd ,那么在完整檔名 (包含路徑名稱) 當(dāng)中,只要有 passwd 在其中, 就會(huì)被顯示出來的!這也是個(gè)很方便好用的命令,如果你忘記某個(gè)文件的完整檔名時(shí)~~
但是,這個(gè)東西還是有使用上的限制呦!為什么呢?你會(huì)發(fā)現(xiàn)使用 locate 來尋找數(shù)據(jù)的時(shí)候特別的快, 這是因?yàn)?locate 尋找的數(shù)據(jù)是由『已創(chuàng)建的數(shù)據(jù)庫(kù) /var/lib/mlocate/』 里面的數(shù)據(jù)所搜尋到的,所以不用直接在去硬盤當(dāng)中存取數(shù)據(jù),呵呵!當(dāng)然是很快速羅!
那么有什么限制呢?就是因?yàn)樗墙?jīng)由數(shù)據(jù)庫(kù)來搜尋的,而數(shù)據(jù)庫(kù)的創(chuàng)建默認(rèn)是在每天運(yùn)行一次 (每個(gè) distribution 都不同,CentOS 5.x 是每天升級(jí)數(shù)據(jù)庫(kù)一次!),所以當(dāng)你新創(chuàng)建起來的文件, 卻還在數(shù)據(jù)庫(kù)升級(jí)之前搜尋該文件,那么 locate 會(huì)告訴你『找不到!』呵呵!因?yàn)楸仨氁?jí)數(shù)據(jù)庫(kù)呀!
那能否手動(dòng)升級(jí)數(shù)據(jù)庫(kù)哪?當(dāng)然可以啊!升級(jí) locate 數(shù)據(jù)庫(kù)的方法非常簡(jiǎn)單,直接輸入『 updatedb 』就可以了! updatedb 命令會(huì)去讀取 /etc/updatedb.conf 這個(gè)配置檔的配置,然后再去硬盤里面進(jìn)行搜尋檔名的動(dòng)作, 最后就升級(jí)整個(gè)數(shù)據(jù)庫(kù)文件羅!因?yàn)?updatedb 會(huì)去搜尋硬盤,所以當(dāng)你運(yùn)行 updatedb 時(shí),可能會(huì)等待數(shù)分鐘的時(shí)間喔!
- updatedb:根據(jù) /etc/updatedb.conf 的配置去搜尋系統(tǒng)硬盤內(nèi)的檔名,并升級(jí) /var/lib/mlocate 內(nèi)的數(shù)據(jù)庫(kù)文件;
- locate:依據(jù) /var/lib/mlocate 內(nèi)的數(shù)據(jù)庫(kù)記載,找出使用者輸入的關(guān)鍵字檔名。
find
[root@www ~]# find [PATH] [option] [action] 選項(xiàng)與參數(shù): 1. 與時(shí)間有關(guān)的選項(xiàng):共有 -atime, -ctime 與 -mtime ,以 -mtime 說明-mtime n :n 為數(shù)字,意義為在 n 天之前的『一天之內(nèi)』被更動(dòng)過內(nèi)容的文件; -mtime +n :列出在 n 天之前(不含 n 天本身)被更動(dòng)過內(nèi)容的文件檔名; -mtime -n :列出在 n 天之內(nèi)(含 n 天本身)被更動(dòng)過內(nèi)容的文件檔名。 -newer file :file 為一個(gè)存在的文件,列出比 file 還要新的文件檔名將過去系統(tǒng)上面 24 小時(shí)內(nèi)有更動(dòng)過內(nèi)容 (mtime) 的文件列出
[root@www ~]# find / -mtime 0 # 那個(gè) 0 是重點(diǎn)!0 代表目前的時(shí)間,所以,從現(xiàn)在開始到 24 小時(shí)前, # 有變動(dòng)過內(nèi)容的文件都會(huì)被列出來!那如果是三天前的 24 小時(shí)內(nèi)? # find / -mtime 3 有變動(dòng)過的文件都被列出的意思!尋找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@www ~]# find /etc -newer /etc/passwd # -newer 用在分辨兩個(gè)文件之間的新舊關(guān)系是很有用的!時(shí)間參數(shù)真是挺有意思的!我們現(xiàn)在知道 atime, ctime 與 mtime 的意義,如果你想要找出一天內(nèi)被更動(dòng)過的文件名稱, 可以使用上述范例一的作法。但如果我想要找出『4天內(nèi)被更動(dòng)過的文件檔名』呢?那可以使用『 find /var -mtime -4』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有沒有加上『+, -』差別很大喔!我們可以用簡(jiǎn)單的圖示來說明一下:
圖中最右邊為目前的時(shí)間,越往左邊則代表越早之前的時(shí)間軸啦。由圖我們可以清楚的知道:
+4代表大於等於5天前的檔名:ex> find /var -mtime +4
?-4代表小於等於4天內(nèi)的文件檔名:ex> find /var -mtime -4
?4則是代表4-5那一天的文件檔名:ex> find /var -mtime 4
?+4代表大於等於5天前的檔名:ex> find /var -mtime +4
?-4代表小於等於4天內(nèi)的文件檔名:ex> find /var -mtime -4
?4則是代表4-5那一天的文件檔名:ex> find /var -mtime 4
非常有趣吧!你可以在 /var/ 目錄下搜尋一下,感受一下輸出文件的差異喔!再來看看其他 find 的用法吧!
選項(xiàng)與參數(shù): 2. 與使用者或群組名稱有關(guān)的參數(shù):-uid n :n 為數(shù)字,這個(gè)數(shù)字是使用者的帳號(hào) ID,亦即 UID ,這個(gè) UID 是記錄在 /etc/passwd 里面與帳號(hào)名稱對(duì)應(yīng)的數(shù)字。這方面我們會(huì)在第四篇介紹。-gid n :n 為數(shù)字,這個(gè)數(shù)字是群組名稱的 ID,亦即 GID,這個(gè) GID 記錄在 /etc/group,相關(guān)的介紹我們會(huì)第四篇說明~-user name :name 為使用者帳號(hào)名稱喔!例如 dmtsai -group name:name 為群組名稱喔,例如 users ; -nouser :尋找文件的擁有者不存在 /etc/passwd 的人! -nogroup :尋找文件的擁有群組不存在於 /etc/group 的文件! 當(dāng)你自行安裝軟件時(shí),很可能該軟件的屬性當(dāng)中并沒有文件擁有者,這是可能的!在這個(gè)時(shí)候,就可以使用 -nouser 與 -nogroup 搜尋。搜尋 /home 底下屬於 vbird 的文件
[root@www ~]# find /home -user vbird # 這個(gè)東西也很有用的~當(dāng)我們要找出任何一個(gè)使用者在系統(tǒng)當(dāng)中的所有文件時(shí), # 就可以利用這個(gè)命令將屬於某個(gè)使用者的所有文件都找出來喔!搜尋系統(tǒng)中不屬於任何人的文件
[root@www ~]# find / -nouser # 透過這個(gè)命令,可以輕易的就找出那些不太正常的文件。 # 如果有找到不屬於系統(tǒng)任何人的文件時(shí),不要太緊張, # 那有時(shí)候是正常的~尤其是你曾經(jīng)以原始碼自行編譯軟件時(shí)。如果你想要找出某個(gè)使用者在系統(tǒng)底下創(chuàng)建了啥咚咚,使用上述的選項(xiàng)與參數(shù),就能夠找出來啦! 至於那個(gè) -nouser 或 -nogroup 的選項(xiàng)功能中,除了你自行由網(wǎng)絡(luò)上面下載文件時(shí)會(huì)發(fā)生之外, 如果你將系統(tǒng)里面某個(gè)帳號(hào)刪除了,但是該帳號(hào)已經(jīng)在系統(tǒng)內(nèi)創(chuàng)建很多文件時(shí),就可能會(huì)發(fā)生無主孤魂的文件存在! 此時(shí)你就得使用這個(gè) -nouser 來找出該類型的文件羅!
選項(xiàng)與參數(shù): 3. 與文件權(quán)限及名稱有關(guān)的參數(shù):-name filename:搜尋文件名稱為 filename 的文件; -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個(gè) SIZE 的規(guī)格有: c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB還要大的文件,就是『 -size +50k 』-type TYPE :搜尋文件的類型為 TYPE 的,類型主要有:一般正規(guī)文件 (f), 裝置文件 (b, c), 目錄 (d), 連結(jié)檔 (l), socket (s), 及 FIFO (p) 等屬性。-perm mode :搜尋文件權(quán)限『剛好等於』 mode 的文件,這個(gè) mode 為類似 chmod 的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !-perm -mode :搜尋文件權(quán)限『必須要全部囊括 mode 的權(quán)限』的文件,舉例來說, 我們要搜尋 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,當(dāng)一個(gè)文件的權(quán)限為 -rwsr-xr-x ,亦即 4755 時(shí),也會(huì)被列出來,因?yàn)?-rwsr-xr-x 的屬性已經(jīng)囊括了 -rwxr--r-- 的屬性了。-perm +mode :搜尋文件權(quán)限『包含任一 mode 的權(quán)限』的文件,舉例來說,我們搜尋 -rwxr-xr-x ,亦即 -perm +755 時(shí),但一個(gè)文件屬性為 -rw------- 也會(huì)被列出來,因?yàn)樗?-rw.... 的屬性存在!找出檔名為 passwd 這個(gè)文件
[root@www ~]# find / -name passwd # 利用這個(gè) -name 可以搜尋檔名啊!找出 /var 目錄下,文件類型為 Socket 的檔名有哪些?
[root@www ~]# find /var -type s # 這個(gè) -type 的屬性也很有幫助喔!尤其是要找出那些怪異的文件, # 例如 socket 與 FIFO 文件,可以用 find /var -type p 或 -type s 來找!搜尋文件當(dāng)中含有 SGID 或 SUID 或 SBIT 的屬性
[root@www ~]# find / -perm +7000 # 所謂的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出, # 所以當(dāng)然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個(gè)權(quán)限, # 因此,就是 +7000 ~了乎?上述范例中比較有趣的就屬 -perm 這個(gè)選項(xiàng)啦!他的重點(diǎn)在找出特殊權(quán)限的文件羅! 我們知道 SUID 與 SGID 都可以配置在二進(jìn)位程序上,假設(shè)我想要找出來 /bin, /sbin 這兩個(gè)目錄下, 只要具有 SUID 或 SGID 就列出來該文件,你可以這樣做:
[root@www ~]# find /bin /sbin -perm +6000因?yàn)?SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 +6000 來處理這個(gè)權(quán)限! 至於 find 后面可以接多個(gè)目錄來進(jìn)行搜尋!另外, find 本來就會(huì)搜尋次目錄,這個(gè)特色也要特別注意喔! 最后,我們?cè)賮砜匆幌?find 還有什么特殊功能吧!
選項(xiàng)與參數(shù): 4. 額外可進(jìn)行的動(dòng)作: -exec command :command 為其他命令,-exec 后面可再接額外的命令來處理搜尋到 的結(jié)果。 -print :將結(jié)果列印到螢?zāi)簧?#xff0c;這個(gè)動(dòng)作是默認(rèn)動(dòng)作!將上個(gè)范例找到的文件使用 ls -l 列出來~
[root@www ~]# find / -perm +7000 -exec ls -l {} \; # 注意到,那個(gè) -exec 后面的 ls -l 就是額外的命令,命令不支持命令別名, # 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!找出系統(tǒng)中,大於 1MB 的文件
[root@www ~]# find / -size +1000k # 雖然在 man page 提到可以使用 M 與 G 分別代表 MB 與 GB, # 不過,俺卻試不出來這個(gè)功能~所以,目前應(yīng)該是僅支持到 c 與 k 吧!find 的特殊功能就是能夠進(jìn)行額外的動(dòng)作(action)。我們將范例八的例子以圖解來說明如下:
該范例中特殊的地方有 {} 以及 \; 還有 -exec 這個(gè)關(guān)鍵字,這些東西的意義為:
{} 代表的是『由 find 找到的內(nèi)容』,如上圖所示,find 的結(jié)果會(huì)被放置到 {} 位置中;
?-exec 一直到 \; 是關(guān)鍵字,代表 find 額外動(dòng)作的開始 (-exec) 到結(jié)束 (\;) ,在這中間的就是 find 命令內(nèi)的額外動(dòng)作。 在本例中就是『 ls -l {} 』羅!
?因?yàn)椤?; 』在 bash 環(huán)境下是有特殊意義的,因此利用反斜線來跳脫。
透過圖 5.2.2 你應(yīng)該就比較容易了解 -exec 到 \; 之間的意義了吧!
如果你要找的文件是具有特殊屬性的,例如 SUID 、文件擁有者、文件大小等等, 那么利用 locate 是沒有辦法達(dá)成你的搜尋的!此時(shí) find 就顯的很重要啦! 另外,find 還可以利用萬(wàn)用字節(jié)來找尋檔名呢!舉例來說,你想要找出 /etc 底下檔名包含 httpd 的文件, 那么你就可以這樣做:
[root@www ~]# find /etc -name '*httpd*'不但可以指定搜尋的目錄(連同次目錄),并且可以利用額外的選項(xiàng)與參數(shù)來找到最正確的檔名!真是好好用! 不過由於 find 在尋找數(shù)據(jù)的時(shí)后相當(dāng)?shù)牟儆脖P!所以沒事情不要使用 find 啦!有更棒的命令可以取代呦!那就是上面提到的 whereis 與 locate羅!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: vim 代码提示功能,让vim可以媲美I
- 下一篇: Kettle中设置环境变量的几种方式