天天看點

Linux入門級需要掌握的指令概說下面是常用指令解析

  • 概說
  • 下面是常用指令解析
    • 1檔案與目錄的檢視 ls
    • 2cp 複制檔案或目錄
    • 3rm 移除檔案或目錄
    • 4mv 移動檔案與目錄或更名
    • 5cat concatenate 檢視檔案内容 tac 反向檢視檔案
    • 6nl 添加行号列印
    • 7head 取出檔案前面幾行tail和head相反
    • 8非純文字檔二進制文檔檢視器 od
      • 顯示文檔内容各指令總結
    • 9修改檔案時間或建立新文檔 touch
    • 10chattr 設定檔案隐藏屬性差別于檔案的rxw屬性lsattr 顯示檔案隐藏屬性
    • 11檔案特殊權限 SUID SGID SBIT
    • 12檔案檔名的搜尋
      • 1 whereis 由一些特定的目錄中尋找檔案檔名
      • 2 locate 和 updatedb
      • 3 find指令詳解
        • 31 與時間有關的選項共有 -atime -ctime 與 -mtime 以 -mtime 說明
        • 32 與使用者或群組名稱有關的參數
        • 23 與檔案權限及名稱有關的參數
        • 24 額外可進行的動作

概說

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--.  root   root        Jun  : -aaa-  <==檔案大小為,是以是空檔案
[[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     
  \S     
  Kernel \r on an \m     

# 是以這個檔案有三行!看到了吧!可以印出行号呢!這對于大檔案要找某個特定的行時,有點用處!
# 如果不想要編排空白行的行号,可以使用『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 :行号在自己欄位的最右方顯示,且不加  ;      
-n rz :行号在自己欄位的最右方顯示,且加  ;
-w  :行号欄位的占用的字元數。
範例一:用 nl 列出 /etc/issue 的内容
[[email protected] ~]# nl /etc/issue     
  \S     
  Kernel \r on an \m
# 注意看,這個檔案其實有三行,第三行為空白(沒有任何字元),
[[email protected] ~]# nl -b a /etc/issue     
  \S     
  Kernel \r on an \m     

# 嗬嗬!行号加上來啰~那麼如果要讓行号前面自動補上 0 呢?可這樣
[[email protected] ~]# nl -b a -n rz /etc/issue
  \S
  Kernel \r on an \m

# 嘿嘿!自動在自己欄位的地方補上 0 了~預設欄位是六位數,如果想要改成 3 位數?[[email protected] ~]# nl -b a -n rz -w 3 /etc/issue
     \S
     Kernel \r on an \m

# 變成僅有 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
範例:如果後面行的資料都不列印,隻列印/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  
    E   L   F     \  \  \  \  \  \  \  \  \   \     >  \   \  \  \      \  \  \  \  \  \   @  \  \  \  \  \  \    \   x   e  \  \  \  \  \  \  \  \  \  \   @  \     \  \t  \   @    \   \   \   \  \  \   \  \  \   @  \  \  \  \  \  \     \.....(後面省略)....
# 最左邊第一欄是以 8 進位來表示bytes數。以上面範例來說,第二欄0000020代表開頭是
# 第 16 個 byes (2x8) 的内容之意。
範例二:請将/etc/issue這個檔案的内容以進位列出儲存值與ASCII的對照表
[[email protected] ~]# od -t oCc /etc/issue
                          \   S     \n   K   e   r   n   e   l       \   r       o   n0000020                    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--.  dmtsai dmtsai  Jun  : 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  :: CST                          <==這是目前的時間
-rw-r--r--.  dmtsai dmtsai  Mar   : bashrc  <==這是 mtime
-rw-r--r--.  dmtsai dmtsai  Jun  : bashrc  <==這是 atime
-rw-r--r--.  dmtsai dmtsai  Jun  : 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 來設定檔案時,如果該檔案被删除了,則資料内容其實還存在磁碟中,可以使用來救援  該檔案喔!

注意  :屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定注意
     :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..gz
範例二:隻找出跟 passwd 有關的『說明檔案』檔名(man page)
[[email protected] ~]# whereis passwd     # 全部的檔名通通列出來!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd..gz /usr/share/man/man5/passwd..gz
[[email protected] ~]# whereis -m passwd  # 隻有在 man 裡面的檔名才抓出來!
passwd: /usr/share/man/man1/passwd..gz /usr/share/man/man5/passwd..gz
           

12.2 locate 和 updatedb

[[email protected] ~]# locate [-ir] keyword
選項與參數:
-i  :忽略大小寫的差異;
-c  :不輸出檔名,僅計算找到的檔案數量
-l  :僅輸出幾行的意思,例如輸出五行則是 -l 
-S  :輸出 locate 所使用的資料庫檔案的相關資訊,包括該資料庫紀錄的檔案/目錄數量等
-r  :後面可接正規表示法的顯示方式
範例一:找出系統中所有與 passwd 相關的檔名,且隻列出  個
[[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:
        , directories     # 總紀錄目錄數
        , files         # 總紀錄檔案數
        ,, bytes in file names
        ,, bytes used to store database
           

12.3 find指令詳解

[[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: 代表 bytes。是以,要找比 KB
                   還要大的檔案,就是『 -size +k 』
   -type TYPE    :搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f), 裝置檔案 (b, c),
                   目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。
   -perm mode  :搜尋檔案權限『剛好等于』 mode 的檔案,這個 mode 為類似 chmod
                 的屬性值,舉例來說, -rwsr-xr-x 的屬性為  !
   -perm -mode :搜尋檔案權限『必須要全部囊括 mode 的權限』的檔案,舉例來說,
                 我們要搜尋 -rwxr--r-- ,亦即  的檔案,使用 -perm -,
                 當一個檔案的權限為 -rwsr-xr-x ,亦即  時,也會被列出來,
                 因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。
   -perm /mode :搜尋檔案權限『包含任一 mode 的權限』的檔案,舉例來說,我們搜尋
                 -rwxr-xr-x ,亦即 -perm / 時,但一個檔案屬性為 -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 環境下是有特殊意義的,是以利用反斜線來跳脫。

繼續閱讀