1. 程式人生 > >Linux入門級需要掌握的命令

Linux入門級需要掌握的命令


概說


1.目錄的相關操作: cd, pwd, mkdir, rmdir
2.檔案與目錄的檢視: ls
3.複製、刪除與移動: cp, rm, mv
4. 取得路徑的名稱與目錄名稱
5.直接檢視檔案內容: cat, tac, nl
6. 可翻頁檢視: more, less
7. 資料擷取: head, tail
8. 非純文字檔: od
9. 修改檔案時間與建置新檔: touch
10. 檔案預設許可權:umask
11. 檔案隱藏屬性: chattr, lsattr
12. 檔案特殊許可權:SUID, SGID, SBIT, 許可權設定


13.觀察檔案型別:file
14.檔案查詢which,whereis, locate / updatedb, find


下面是常用命令解析


1。檔案與目錄的檢視: ls

[[email protected] ~]# ls [-aAdfFhilnrRSt] 檔名或目錄名稱..
[[email protected] ~]# ls [--color={never,auto,always}] 檔名或目錄名稱..
[[email protected] ~]# ls [--full-time] 檔名或目錄名稱..選項與引數:
-a  :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)
-A  :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄
-d  :僅列出目錄本身,而不是列出目錄內的檔案資料(常用)
-f  :直接列出結果,而不進行排序 (ls 預設會以檔名排序!)
-F  :根據檔案、目錄等資訊,給予附加資料結構,例如:
      *:代表可執行檔; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案;
-h  :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來;
-i  :列出 inode 號碼,inode 的意義下一章將會介紹;
-l  :長資料串列出,包含檔案的屬性與許可權等等資料;(常用)
-n  :列出 UID 與 GID 而非使用者與群組的名稱 (UID與GID會在帳號管理提到!)
-r  :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小;
-R  :連同子目錄內容一起列出來,等於該目錄下的所有檔案都會顯示出來;
-S  :以檔案容量大小排序,而不是用檔名排序;
-t  :依時間排序,而不是用檔名。
--color=never  :不要依據檔案特性給予顏色顯示;
--color=always :顯示顏色
--color=auto   :讓系統自行依據設定來判斷是否給予顏色
--full-time    :以完整時間模式 (包含年、月、日、時、分) 輸出
--time={atime,ctime} :輸出 access 時間或改變許可權屬性時間 (ctime) 
                       而非內容變更時間 (modification time)

2。cp (複製檔案或目錄)

[[email protected] ~]# cp [-adfilprsu] 來源檔(source) 目標檔(destination)
[[email protected] ~]# cp [options] source1 source2 source3 .... directory
選項與引數:
-a  :相當於 -dr --preserve=all 的意思,至於 dr 請參考下列說明;(常用)
-d  :若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身;
-f  :為強制(force)的意思,若目標檔案已經存在且無法開啟,則移除後再嘗試一次;
-i  :若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
-l  :進行硬式連結(hard link)的連結檔建立,而非複製檔案本身;
-p  :連同檔案的屬性(許可權、使用者、時間)一起復制過去,而非使用預設屬性(備份常用);
-r  :遞迴持續複製,用於目錄的複製行為;(常用)
-s  :複製成為符號連結檔 (symbolic link),亦即『捷徑』檔案;
-u  :destination 比 source 舊才更新 destination,或 destination 不存在的情況下才複製。
--preserve=all :除了 -p 的許可權相關引數外,還加入 SELinux 的屬性, links, xattr 等也複製了。
最後需要注意的,如果來源檔有兩個以上,則最後一個目的檔一定要是『目錄』才行!

3。rm (移除檔案或目錄)

[[email protected] ~]# rm [-fir] 檔案或目錄
選項與引數:
-f  :就是 force 的意思,忽略不存在的檔案,不會出現警告訊息;
-i  :互動模式,在刪除前會詢問使用者是否動作
-r  :遞迴刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!範例一:將剛剛在 cp 的範例中建立的 bashrc 刪除掉!
[[email protected] ~]# cd /tmp
[[email protected] tmp]# rm -i bashrc
rm: remove regular file 'bashrc'? y
# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!
範例二:透過萬用字元*的幫忙,將/tmp底下開頭為bashrc的檔名通通刪除:
[[email protected] tmp]# rm -i bashrc* 
# 注意那個星號,代表的是 0 到無窮多個任意字元喔!很好用的東西!
範例三:將 cp 範例中所建立的 /tmp/etc/ 這個目錄刪除掉!
[[email protected] tmp]# rmdir /tmp/etc
rmdir: failed to remove '/tmp/etc': Directory not empty   <== 刪不掉啊!因為這不是空的目錄!
[[email protected] tmp]# rm -r /tmp/etc
rm: descend into directory '/tmp/etc'? y
rm: remove regular file '/tmp/etc/fstab'? y
rm: remove regular empty file '/tmp/etc/crypttab'? 
^C  <== 按下 [ctrl]+c 中斷.....(中間省略).....
# 因為身份是 root ,預設已經加入了 -i 的選項,所以你要一直按 y 才會刪除!
# 如果不想要繼續按 y ,可以按下『 [ctrl]-c 』來結束 rm 的工作。
# 這是一種保護的動作,如果確定要刪除掉此目錄而不要詢問,可以這樣做:
[[email protected] tmp]# \rm -r /tmp/etc
# 在指令前加上反斜線,可以忽略掉 alias 的指定選項喔!至於 alias 我們在bash再談!
# 拜託!這個範例很可怕!你不要刪錯了!刪除 /etc 系統是會掛掉的!
範例四:刪除一個帶有 - 開頭的檔案
[[email protected] tmp]# touch ./-aaa-  <==touch這個指令可以建立空檔案!
[[email protected] tmp]# ls -l 
-rw-r--r--. 1 root   root       0 Jun 11 19:22 -aaa-  <==檔案大小為0,所以是空檔案
[[email protected] tmp]# rm -aaa-
rm: invalid option -- 'a'                    <== 因為 "-" 是選項嘛!所以系統誤判了!
Try 'rm ./-aaa-' to remove the file '-aaa-'. <== 新的 bash 有給建議的
Try 'rm --help' for more information.
[[email protected] tmp]# rm ./-aaa-

4。mv (移動檔案與目錄,或更名)

[[email protected] ~]# mv [-fiu] source destination
[[email protected] ~]# mv [options] source1 source2 source3 .... directory</span>
選項與引數:  -f  :force 強制的意思,如果目標檔案已經存在,不會詢問而直接覆蓋;                       
            -i  :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋!
            -u  :若目標檔案已經存在,且 source 比較新,才會更新 (update)
範例一:複製一檔案,建立一目錄,將檔案移動到目錄中 
[[email protected] ~]# cd /tmp 
[[email protected] tmp]# cp ~/.bashrc bashrc 
[[email protected] tmp]# mkdir mvtest
[[email protected] tmp]# mv bashrc mvtest
# 將某個檔案移動到某個目錄去,就是這樣做!
範例二:將剛剛的目錄名稱更名為 mvtest2
[[email protected] tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡單~
# 其實在 Linux 底下還有個有趣的指令,名稱為 rename ,
# 該指令專職進行多個檔名的同時更名,並非針對單一檔名變更,與mv不同。請man rename。
範例三:再建立兩個檔案,再全部移動到 /tmp/mvtest2 當中 
[[email protected] tmp]# cp ~/.bashrc bashrc1 
[[email protected] tmp]# cp ~/.bashrc bashrc2
[[email protected] tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到這邊,如果有多個來原始檔或目錄,則最後一個目標檔一定是『目錄!』
# 意思是說,將所有的資料移動到該目錄的意思!

5。cat (concatenate) :檢視檔案內容, tac: 反向檢視檔案

[[email protected] ~]# cat [-AbEnTv]
選項與引數:-A  :相當於 -vET 的整合選項,可列出一些特殊字元而不是空白而已;
          -b  :列出行號,僅針對非空白行做行號顯示,空白行不標行號!
          -E  :將結尾的斷行字元 $ 顯示出來;
          -n  :列印出行號,連同空白行也會有行號,與 -b 的選項不同;
          -T  :將 [tab] 按鍵以 ^I 顯示出來;
          -v  :列出一些看不出來的特殊字元
範例一:檢閱 /etc/issue 這個檔案的內容
[[email protected] ~]# cat /etc/issue\SKernel \r on an \m
範例二:承上題,如果還要加印行號呢?
[[email protected] ~]# cat -n /etc/issue     
1  \S     
2  Kernel \r on an \m     
3
# 所以這個檔案有三行!看到了吧!可以印出行號呢!這對於大檔案要找某個特定的行時,有點用處!
# 如果不想要編排空白行的行號,可以使用『cat -b /etc/issue』,自己測試看看:
範例三:將 /etc/man_db.conf 的內容完整的顯示出來(包含特殊字元)
[[email protected] ~]# cat -A /etc/man_db.conf
# $....(中間省略)....MANPATH_MAP^I/bin^I^I^I/usr/share/man$MANPATH_MAP^I/usr/bin^I^I/usr/share/man$MANPATH_MAP^I/sbin^I^I^I/usr/share/man$MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$.....(底下省略).....
# 上面的結果限於篇幅,刪除掉很多資料了。另外,輸出的結果並不會有特殊字型,
# 上面的特殊字型是要讓您發現差異點在哪裡就是了。基本上,在一般的環境中,
# 使用 [tab] 與空白鍵的效果差不多,都是一堆空白啊!我們無法知道兩者的差別。
# 此時使用 cat -A 就能夠發現那些空白的地方是啥鬼東西了![tab]會以 ^I 表示,
# 斷行字元則是以 $ 表示,所以你可以發現每一行後面都是 $ 啊!不過斷行字元# 在Windows/Linux則不太相同,Windows的斷行字元是 ^M$ 囉。
[[email protected] ~]# tac /etc/issueKernel 
\r on an \m\S
# 嘿嘿!與剛剛上面的範例一比較,是由最後一行先顯示喔!

6。nl (新增行號列印)

[[email protected] ~]# nl [-bnw] 
檔案選項與引數:
-b  :指定行號指定的方式,主要有兩種:     
 -b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);     
 -b t :如果有空行,空的那一行不要列出行號(預設值);
-n  :列出行號表示的方法,主要有三種:      
-n ln :行號在螢幕的最左方顯示;     
 -n rn :行號在自己欄位的最右方顯示,且不加 0 ;      
-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-w  :行號欄位的佔用的字元數。
範例一:用 nl 列出 /etc/issue 的內容
[[email protected] ~]# nl /etc/issue     
1  \S     
2  Kernel \r on an \m
# 注意看,這個檔案其實有三行,第三行為空白(沒有任何字元),
[[email protected] ~]# nl -b a /etc/issue     
1  \S     
2  Kernel \r on an \m     
3
# 嗬嗬!行號加上來囉~那麼如果要讓行號前面自動補上 0 呢?可這樣
[[email protected] ~]# nl -b a -n rz /etc/issue
000001  \S
000002  Kernel \r on an \m
000003
# 嘿嘿!自動在自己欄位的地方補上 0 了~預設欄位是六位數,如果想要改成 3 位數?[[email protected] ~]# nl -b a -n rz -w 3 /etc/issue
001     \S
002     Kernel \r on an \m
003
# 變成僅有 3 位數囉~

7。head (取出檔案前面幾行),tail和head相反。

[[email protected] ~]# head [-n number] 檔案 
選項與引數:-n  :後面接數字,代表顯示幾行的意思
[[email protected] ~]# head /etc/man_db.conf
# 預設的情況中,顯示前面十行!若要顯示前 20 行,就得要這樣:
[[email protected] ~]# head -n 20 /etc/man_db.conf
範例:如果後面100行的資料都不列印,只列印/etc/man_db.conf的前面幾行,該如何是好?
[[email protected] ~]# head -n -100 /etc/man_db.conf

8。非純文字檔(二進位制文件檢視器): od

我們上面提到的,都是在查閱純文字檔的內容。那麼萬一我們想要查閱非文字檔,舉例來說,例如 /usr/bin/passwd 這個執行檔的內容時, 又該如何去讀出資訊呢?事實上,由於執行檔通常是 binary file ,使用上頭提到的指令來讀取他的內容時, 確實會產生類似亂碼的資料啊!那怎麼辦?沒關係,我們可以利用 od 這個指令來讀取喔!

[[email protected] ~]# od [-t TYPE] 
檔案選項或引數:
-t  :後面可以接各種『型別 (TYPE)』的輸出,
例如:     
 a   :利用預設的字元來輸出; 
 c   :使用 ASCII 字元來輸出      
d[size] :利用十進位(decimal)來輸出資料,每個整數佔用 size bytes ;      
f[size] :利用浮點數值(floating)來輸出資料,每個數佔用 size bytes ;      
o[size] :利用八進位(octal)來輸出資料,每個整數佔用 size bytes ;      
x[size] :利用十六進位(hexadecimal)來輸出資料,每個整數佔用 size bytes ;
範例一:請將/usr/bin/passwd的內容使用ASCII方式來展現!
[[email protected] ~]# od -t c /usr/bin/passwd  
0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \00000020 003  \0     >  \0 001  \0  \0  \0 364   3  \0  \0  \0  \0  \0  \00000040   @  \0  \0  \0  \0  \0  \0    \0   x   e  \0  \0  \0  \0  \0  \00000060  \0  \0  \0  \0   @  \0   8  \0  \t  \0   @    \0 035  \0 034  \00000100 006  \0  \0  \0 005  \0  \0  \0   @  \0  \0  \0  \0  \0  \0     \0.....(後面省略)....
# 最左邊第一欄是以 8 進位來表示bytes數。以上面範例來說,第二欄0000020代表開頭是
# 第 16 個 byes (2x8) 的內容之意。
範例二:請將/etc/issue這個檔案的內容以8進位列出儲存值與ASCII的對照表
[[email protected] ~]# od -t oCc /etc/issue
0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040          \   S     \n   K   e   r   n   e   l       \   r       o   n0000020 141 156 040 134 155 012 012             a   n       \   m  \n  \n0000027
# 如上所示,可以發現每個字元可以對應到的數值為何!要注意的是,該數值是 8 進位喔!
# 例如 S 對應的記錄數值為 123 ,轉成十進位:1x8^2+2x8+3=83。

顯示文件內容各命令總結

cat 由第一行開始顯示檔案內容
tac 從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫!
nl 顯示的時候,順道輸出行號!
more 一頁一頁的顯示檔案內容
less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
head 只看頭幾行
tail 只看尾巴幾行
od 以二進位的方式讀取檔案內容!


9。修改檔案時間或建立新文件: touch

我們在 ls 這個指令的介紹時,有稍微提到每個檔案在linux底下都會記錄許多的時間引數, 其實是有三個主要的變動時間。
那麼三個時間的意義是什麼呢?
modification time (mtime):當該檔案的『內容資料』變更時,就會更新這個時間!內容資料指的是檔案的內容,而不是檔案的屬性或許可權喔!
status time (ctime):當該檔案的『狀態 (status)』改變時,就會更新這個時間,舉例來說,像是許可權與屬性被更改了,都會更新這個時間啊。
access time (atime):當『該檔案的內容被取用』時,就會更新這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/man_db.conf , 就會更新該檔案的 atime 了。
[[email protected] ~]# touch [-acdmt] 
檔案選項與引數:
-a  :僅修訂 access time;
-c  :僅修改檔案的時間,若該檔案不存在則不建立新檔案;
-d  :後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間"
-m  :僅修改 mtime ;
-t  :後面可以接欲修訂的時間而不用目前的時間,格式為[YYYYMMDDhhmm]
範例一:新建一個空的檔案並觀察時間
[[email protected] ~]# cd /tmp
[[email protected] tmp]# touch testtouch
[[email protected] tmp]# ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch
# 注意到,這個檔案的大小是 0 呢!在預設的狀態下,如果 touch 後面有接檔案,
# 則該檔案的三個時間 (atime/ctime/mtime) 都會更新為目前的時間。若該檔案不存在,則會主動的建立一個新的   空的檔案喔!例如上面這個例子!
範例二:將 ~/.bashrc 複製成為 bashrc,假設複製完全的屬性,檢查其日期   
[[email protected] tmp]# cp -a ~/.bashrc bashrc
[[email protected] tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:49:24 CST 2015                         <==這是目前的時間
-rw-r--r--. 1 dmtsai dmtsai 231 Mar  6 06:06 bashrc  <==這是 mtime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc  <==這是 atime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc  <==這是 ctime
---

10。chattr (設定檔案隱藏屬性,區別於檔案的rxw屬性),lsattr (顯示檔案隱藏屬性)

[[email protected] ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與引數:
+   :增加某一個特殊引數,其他原本存在引數則不動。
-   :移除某一個特殊引數,其他原本存在引數則不動。
=   :設定一定,
且僅有後面接的引數
A  :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime 將不會被修改,   
可避免 I/O 較慢的機器過度的存取磁碟。(目前建議使用檔案系統掛載引數處理這個專案)
S  :一般檔案是非同步寫入磁碟的(原理請參考前一章sync的說明),如果加上 S 這個屬性時,當你進行任何檔案的   修改,該更動會『同步』寫入磁碟中。
a  :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root 才能設定這屬性
c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進   行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d  :當 dump 程式被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份i :這個 i 可就很厲害   了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』對於系統安全性有相當大的助益!只   有 root 能設定此屬性
s  :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,所以如果誤刪了,完全無  法救回來了喔!
u  :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援  該檔案喔!

注意  1:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定注意
     2:xfs 檔案系統僅支援 AadiS 而已

範例:請嘗試到/tmp底下建立檔案,並加入 i 的引數,嘗試刪除看看。
[[email protected] ~]# cd /tmp
[[email protected] tmp]# touch attrtest     <==建立一個空檔案
[[email protected] tmp]# chattr +i attrtest <==給予 i 的屬性
[[email protected] tmp]# rm attrtest        <==嘗試刪除看看rm: remove regular empty file `attrtest'? yrm: cannot remove `attrtest': Operation not permitted
# 看到了嗎?呼呼!連 root 也沒有辦法將這個檔案刪除呢!趕緊解除設定!範例:請將該檔案的 i 屬性取消!
[[email protected] tmp]# chattr -i attrtest
[[email protected] ~]# lsattr [-adR] 檔案或目錄選項與引數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來! 
[[email protected] tmp]# chattr +aiS attrtest
[[email protected] tmp]# lsattr attrtest
--S-ia---------- attrtest
使用 chattr 設定後,可以利用 lsattr 來查閱隱藏的屬性。不過, 這兩個指令在使用上必須要特別小心,否則會造成很大的困擾。例如:某天你心情好,突然將 /etc/shadow 這個重要的密碼記錄檔案給他設定成為具有 i 的屬性,那麼過了若干天之後, 你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!

11。檔案特殊許可權: SUID, SGID, SBIT

SUID/SGID/SBIT 許可權設定
前面介紹過 SUID 與 SGID 的功能,那麼如何設定檔案使成為具有 SUID 與 SGID 的許可權呢? 這就需要第五章的數字更改許可權的方法了! 現在你應該已經知道數字型態更改許可權的方式為『三個數字』的組合, 那麼如果在這三個數字之前再加上一個數字的話,最前面的那個數字就代表這幾個許可權了!

4 為 SUID
2 為 SGID
1 為 SBIT

假設要將一個檔案許可權改為『-rwsr-xr-x』時,由於 s 在使用者許可權中,所以是 SUID ,因此, 在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來設定!此外,還有大 S 與大 T 的產生喔!參考底下的範例啦!


12。檔案檔名的搜尋

再來談一談怎麼搜尋檔案吧!在 Linux 底下也有相當優異的搜尋指令呦!通常 find 不很常用的!因為速度慢之外, 也很操硬碟!一般我們都是先使用 whereis 或者是locate 來檢查,如果真的找不到了,才以 find 來搜尋呦! 為什麼呢?因為 whereis 只找系統中某些特定目錄底下的檔案而已,locate 則是利用資料庫來搜尋檔名,當然兩者就相當的快速, 並且沒有實際的搜尋硬碟內的檔案系統狀態,比較省時間啦!


12.1 whereis (由一些特定的目錄中尋找檔案檔名)

[[email protected] ~]# whereis [-bmsu] 檔案或目錄名選項與引數:
-l    :可以列出 whereis 會去查詢的幾個主要目錄而已
-b    :只找 binary 格式的檔案
-m    :只找在說明檔 manual 路徑下的檔案
-s    :只找 source 來原始檔
-u    :搜尋不在上述三個專案當中的其他特殊檔案
範例一:請找出 ifconfig 這個檔名
[[email protected] ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
範例二:只找出跟 passwd 有關的『說明檔案』檔名(man page)
[[email protected] ~]# whereis passwd     # 全部的檔名通通列出來!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[[email protected] ~]# whereis -m passwd  # 只有在 man 裡面的檔名才抓出來!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

12.2 locate 和 updatedb

[[email protected] ~]# locate [-ir] keyword
選項與引數:
-i  :忽略大小寫的差異;
-c  :不輸出檔名,僅計算找到的檔案數量
-l  :僅輸出幾行的意思,例如輸出五行則是 -l 5
-S  :輸出 locate 所使用的資料庫檔案的相關資訊,包括該資料庫紀錄的檔案/目錄數量等
-r  :後面可接正規表示法的顯示方式
範例一:找出系統中所有與 passwd 相關的檔名,且只列出 5 個
[[email protected] ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
範例二:列出 locate 查詢所使用的資料庫檔案之檔名與各資料數量
[[email protected] ~]# locate -S
Database /var/lib/mlocate/mlocate.db:
        8,086 directories     # 總紀錄目錄數
        109,605 files         # 總紀錄檔案數
        5,190,295 bytes in file names
        2,349,150 bytes used to store database

12.3 find命令詳解

[r[email protected] ~]# find [PATH] [option] [action]

12.3.1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明

-mtime n :n 為數字,意義為在 n 天之前的『一天之內』被更動過內容的檔案;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的檔案檔名;
-mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的檔案檔名。
-newer file :file 為一個存在的檔案,列出比 file 還要新的檔案檔名

範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的檔案列出

[[email protected] ~]# find / -mtime 0
# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,
# 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內?
# find / -mtime 3 有變動過的檔案都被列出的意思!
範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出
[[email protected] ~]# find /etc -newer /etc/passwd
# -newer 用在分辨兩個檔案之間的新舊關係是很有用的!

12.3.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 底下屬於 dmtsai 的檔案 

[[email protected] ~]# find /home -user dmtsai
\# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,
\# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!

範例四:搜尋系統中不屬於任何人的檔案
[[email protected] ~]# find / -nouser
\# 透過這個指令,可以輕易的就找出那些不太正常的檔案。如果有找到不屬於系統任何人的檔案時,
\# 不要太緊張,那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時。

12.2.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 這個檔案

[[email protected] ~]# find / -name passw

範例五:找出檔名包含了 passwd 這個關鍵字的檔案
[[email protected] ~]# find / -name "*passwd*"
# 利用這個 -name 可以搜尋檔名啊!預設是完整檔名,如果想要找關鍵字,
# 可以使用類似 * 的任意字元來處理

範例六:找出 /run 目錄下,檔案型別為 Socket 的檔名有哪些?
[[email protected] ~]# find /run -type s
# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案,
# 例如 socket 與 FIFO 檔案,可以用 find /run -type p 或 -type s 來找!

範例七:搜尋檔案當中含有 SGID 或 SUID 或 SBIT 的屬性
[[email protected] ~]# find / -perm /7000 
# 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,所以當然要使用 /7000,
# 使用 -7000 表示要同時含有 ---s--s--t 的所有三個許可權。而只需要任意一個,就是 /7000 ~瞭乎?

12.2.4. 額外可進行的動作

-exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到的結果。
-print :將結果列印到螢幕上,這個動作是預設動作!範例八:將上個範例找到的檔案使用 ls -l 列出來~
[[email protected] ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
/# 注意到,那個 -exec 後面的 ls -l 就是額外的指令,指令不支援命令別名,
/# 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!範例九:找出系統中,大於 1MB 的檔案
[[email protected] ~]# find / -size +1M
find 的特殊功能就是能夠進行額外的動作(action)。

find 相關的額外動作
該範例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義為:
{} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
-exec 一直到 \; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』囉!
因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。