**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
[root@study ~]# ls [-aAdfFhilnrRSt] 檔名或目錄名稱..
[root@study ~]# ls [–color={never,auto,always}] 檔名或目錄名稱..
[root@study ~]# 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 (復制文件或目錄)
[root@study ~]# cp [-adfilprsu] 來源檔(source) 目標檔(destination)
[root@study ~]# 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 (移除文件或目錄)
[root@study ~]# rm [-fir] 文件或目錄
選項與參數:
-f :就是 force 的意思,忽略不存在的文件,不會出現警告訊息;
-i :互動模式,在刪除前會詢問使用者是否動作
-r :遞迴刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!范例一:將剛剛在 cp 的范例中建立的 bashrc 刪除掉!
[root@study ~]# cd /tmp
[root@study tmp]# rm -i bashrc
rm: remove regular file bashrc'? y# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!范例二:透過萬用字元*的幫忙,將/tmp底下開頭為bashrc的檔名通通刪除:
/tmp/etc’? y
[root@study tmp]# rm -i bashrc*# 注意那個星號,代表的是 0 到無窮多個任意字元喔!很好用的東西!范例三:將 cp 范例中所建立的 /tmp/etc/ 這個目錄刪除掉!
[root@study tmp]# rmdir /tmp/etc
rmdir: failed to remove '/tmp/etc': Directory not empty <== 刪不掉啊!因為這不是空的目錄!
[root@study tmp]# rm -r /tmp/etc
rm: descend into directory
rm: remove regular file /tmp/etc/fstab'? y
/tmp/etc/crypttab’?
rm: remove regular empty file
^C <== 按下 [ctrl]+c 中斷…..(中間省略)…..
[root@study tmp]# \rm -r /tmp/etc# 在指令前加上反斜線,可以忽略掉 alias 的指定選項喔!至於 alias 我們在bash再談!
[root@study tmp]# touch ./-aaa- <==touch這個指令可以建立空文件!
[root@study tmp]# ls -l
-rw-r–r–. 1 root root 0 Jun 11 19:22 -aaa- <==文件大小為0,所以是空文件
[root@study tmp]# rm -aaa-
rm: invalid option – ‘a’ <== 因為 “-” 是選項嘛!所以系統誤判了!
Try ‘rm ./-aaa-’ to remove the file `-aaa-‘. <== 新的 bash 有給建議的
Try ‘rm –help’ for more information.
[root@study tmp]# rm ./-aaa-
4。mv (移動文件與目錄,或更名)
[root@study ~]# mv [-fiu] source destination
[root@study ~]# mv [options] source1 source2 source3 …. directory
選項與參數: -f :force 強制的意思,如果目標文件已經存在,不會詢問而直接覆蓋;
-i :若目標文件 (destination) 已經存在時,就會詢問是否覆蓋!
-u :若目標文件已經存在,且 source 比較新,才會更新 (update)
范例一:復制一文件,建立一目錄,將文件移動到目錄中
[root@study ~]# cd /tmp
[root@study tmp]# cp ~/.bashrc bashrc
[root@study tmp]# mkdir mvtest
[root@study tmp]# mv bashrc mvtest
范例二:將剛剛的目錄名稱更名為 mvtest2
[root@study tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡單~
# 該指令專職進行多個檔名的同時更名,並非針對單一檔名變更,與mv不同。請man rename。
范例三:再建立兩個文件,再全部移動到 /tmp/mvtest2 當中
[root@study tmp]# cp ~/.bashrc bashrc1
[root@study tmp]# cp ~/.bashrc bashrc2
[root@study tmp]# mv bashrc1 bashrc2 mvtest2
5。cat (concatenate) 查看文件內容
[root@study ~]# cat [-AbEnTv]
選項與參數:-A :相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已;
-b :列出行號,僅針對非空白行做行號顯示,空白行不標行號!
-E :將結尾的斷行字元 $ 顯示出來;
-n :列印出行號,連同空白行也會有行號,與 -b 的選項不同;
-T :將 [tab] 按鍵以 ^I 顯示出來;
-v :列出一些看不出來的特殊字符
范例一:檢閱 /etc/issue 這個文件的內容
[root@study ~]# cat /etc/issue\SKernel \r on an \m
范例二:承上題,如果還要加印行號呢?
[root@study ~]# cat -n /etc/issue
1 \S
2 Kernel \r on an \m
3
范例三:將 /etc/man_db.conf 的內容完整的顯示出來(包含特殊字元)
[root@study ~]# cat -A /etc/man_db.conf
6。tac (反向顯示文件內容,和cat相反)
[root@study ~]# tac /etc/issueKernel
\r on an \m\S
7。nl (添加行號列印)
[root@study ~]# nl [-bnw]
文件選項與參數:
-b :指定行號指定的方式,主要有兩種:
-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);
-b t :如果有空行,空的那一行不要列出行號(預設值);
-n :列出行號表示的方法,主要有三種:
-n ln :行號在螢幕的最左方顯示;
-n rn :行號在自己欄位的最右方顯示,且不加 0 ;
-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-w :行號欄位的占用的字元數。
范例一:用 nl 列出 /etc/issue 的內容
[root@study ~]# nl /etc/issue
1 \S
2 Kernel \r on an \m
[root@study ~]# nl -b a /etc/issue
1 \S
2 Kernel \r on an \m
3
[root@study ~]# nl -b a -n rz /etc/issue
000001 \S
000002 Kernel \r on an \m
000003
001 \S
002 Kernel \r on an \m
003
8。head (取出文件前面幾行),tail和head相反。
[root@study ~]# head [-n number] 文件
選項與參數:-n :後面接數字,代表顯示幾行的意思
[root@study ~]# head /etc/man_db.conf
[root@study ~]# head -n 20 /etc/man_db.conf
范例:如果後面100行的資料都不列印,只列印/etc/man_db.conf的前面幾行,該如何是好?
[root@study ~]# head -n -100 /etc/man_db.conf
9。非純文字檔(二進制文檔查看器): od
我們上面提到的,都是在查閱純文字檔的內容。那麼萬一我們想要查閱非文字檔,舉例來說,例如 /usr/bin/passwd 這個執行檔的內容時, 又該如何去讀出資訊呢?事實上,由於執行檔通常是 binary file ,使用上頭提到的指令來讀取他的內容時, 確實會產生類似亂碼的資料啊!那怎麼辦?沒關係,我們可以利用 od 這個指令來讀取喔![root@study ~]# 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方式來展現!
[root@study ~]# 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…..(後面省略)….
范例二:請將/etc/issue這個文件的內容以8進位列出儲存值與ASCII的對照表[root@study ~]# 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
10。修改文件時間或創建新文檔: touch
我們在 ls 這個指令的介紹時,有稍微提到每個文件在linux底下都會記錄許多的時間參數, 其實是有三個主要的變動時間,那麼三個時間的意義是什麼呢?modification time (mtime):當該文件的『內容資料』變更時,就會更新這個時間!內容資料指的是文件的內容,而不是文件的屬性或權限喔!status time (ctime):當該文件的『狀態 (status)』改變時,就會更新這個時間,舉例來說,像是權限與屬性被更改了,都會更新這個時間啊。 access time (atime):當『該文件的內容被取用』時,就會更新這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/man_db.conf , 就會更新該文件的 atime 了。
[root@study ~]# touch [-acdmt]
文件選項與參數:
-a :僅修訂 access time;
-c :僅修改文件的時間,若該文件不存在則不建立新文件;
-d :後面可以接欲修訂的日期而不用目前的日期,也可以使用 –date=”日期或時間”
-m :僅修改 mtime ;
-t :後面可以接欲修訂的時間而不用目前的時間,格式為[YYYYMMDDhhmm]
范例一:新建一個空的文件並觀察時間
[dmtsai@study ~]# cd /tmp
[dmtsai@study tmp]# touch testtouch
[dmtsai@study tmp]# ls -l testtouch
-rw-rw-r–. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch
范例二:將 ~/.bashrc 復制成為 bashrc,假設復制完全的屬性,檢查其日期[dmtsai@study tmp]# cp -a ~/.bashrc bashrc
[dmtsai@study 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
11。chattr (設定文件隱藏屬性,區別於文件的rxw屬性),lsattr (顯示文件隱藏屬性)[root@study ~]# 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 的參數,嘗試刪除看看。
[root@study ~]# cd /tmp
[root@study tmp]# touch attrtest <==建立一個空文件
[root@study tmp]# chattr +i attrtest <==給予 i 的屬性
[root@study tmp]# rm attrtest <==嘗試刪除看看rm: remove regular empty file attrtest'? yrm: cannot remove
attrtest’: Operation not permitted
[root@study tmp]# chattr -i attrtest
[root@study ~]# lsattr [-adR] 文件或目錄選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一並列出來!
[root@study tmp]# chattr +aiS attrtest
[root@study tmp]# lsattr attrtest
–S-ia———- attrtest
使用 chattr 設定後,可以利用 lsattr 來查閱隱藏的屬性。不過, 這兩個指令在使用上必須要特別小心,否則會造成很大的困擾。例如:某天你心情好,突然將 /etc/shadow 這個重要的密碼記錄文件給他設定成為具有 i 的屬性,那麼過了若干天之後, 你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!
12。文件特殊權限: 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 的產生喔!參考底下的范例啦!
13。文件檔名的搜尋
再來談一談怎麼搜尋文件吧!在 Linux 底下也有相當優異的搜尋指令呦!通常 find 不很常用的!因為速度慢之外, 也很操硬碟!一般我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦! 為什麼呢?因為 whereis 只找系統中某些特定目錄底下的文件而已,locate 則是利用資料庫來搜尋檔名,當然兩者就相當的快速, 並且沒有實際的搜尋硬碟內的文件系統狀態,比較省時間啦!
whereis (由一些特定的目錄中尋找文件檔名)
[root@study ~]# whereis [-bmsu] 文件或目錄名選項與參數:
-l :可以列出 whereis 會去查詢的幾個主要目錄而已
-b :只找 binary 格式的文件
-m :只找在說明檔 manual 路徑下的文件
-s :只找 source 來源文件
-u :搜尋不在上述三個項目當中的其他特殊文件
范例一:請找出 ifconfig 這個檔名
[root@study ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
范例二:只找出跟 passwd 有關的『說明文件』檔名(man page)
[root@study ~]# whereis passwd # 全部的檔名通通列出來!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[root@study ~]# whereis -m passwd # 只有在 man 裡面的檔名才抓出來!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
locate 和 updatedb
[root@study ~]# locate [-ir] keyword
選項與參數:
-i :忽略大小寫的差異;
-c :不輸出檔名,僅計算找到的文件數量
-l :僅輸出幾行的意思,例如輸出五行則是 -l 5
-S :輸出 locate 所使用的資料庫文件的相關資訊,包括該資料庫紀錄的文件/目錄數量等
-r :後面可接正規表示法的顯示方式
范例一:找出系統中所有與 passwd 相關的檔名,且只列出 5 個
[root@study ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
范例二:列出 locate 查詢所使用的資料庫文件之檔名與各資料數量
[root@study ~]# 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
find命令詳解
[root@study ~]# 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@study ~]# find / -mtime 0
范例二:尋找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
范例四:搜尋系統中不屬於任何人的文件
[root@study ~]# find / -nouser
[root@study ~]# find / -name passwd
范例五-1:找出檔名包含了 passwd 這個關鍵字的文件
[root@study ~]# find / -name “passwd”
范例六:找出 /run 目錄下,文件類型為 Socket 的檔名有哪些?
[root@study ~]# find /run -type s
范例七:搜尋文件當中含有 SGID 或 SUID 或 SBIT 的屬性
[root@study ~]# find / -perm /7000
[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
[root@study ~]# find / -size +1M
find 的特殊功能就是能夠進行額外的動作(action)。
find 相關的額外動作
該范例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義為:
{} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
-exec 一直到 \; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』啰!
因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。