常用的文件和目錄操作命令(轉)


cd (變換目錄)

我們知道vbird這個使用者的家目錄是/home/vbird/,而root家目錄則是/root/,假設我以root身份在 Linux系統中,那麼簡單的說明一下這幾個特殊的目錄的意義是:

複製代碼
[root@www ~]# cd [相對路徑或絕對路徑]
# 最重要的就是目錄的絕對路徑與相對路徑,還有一些特殊目錄的符號羅!
[root@www ~]# cd ~vbird
# 代表去到 vbird 這個使用者的家目錄,亦即 /home/vbird
[root@www vbird]# cd ~
# 表示回到自己的家目錄,亦即是 /root 這個目錄
[root@www ~]# cd
# 沒有加上任何路徑,也還是代表回到自己家目錄的意思喔!
[root@www ~]# cd ..
# 表示去到目前的上一級目錄,亦即是 /root 的上一級目錄的意思;
[root@www /]# cd -
# 表示回到剛剛的那個目錄,也就是 /root 羅~
[root@www ~]# cd /var/spool/mail
# 這個就是絕對路徑的寫法!直接指定要去的完整路徑名稱!
[root@www mail]# cd ../mqueue
# 這個是相對路徑的寫法,我們由/var/spool/mail 去到/var/spool/mqueue 就這樣寫!
複製代碼

cd是Change Directory的縮寫,這是用來變換工作目錄的命令。注意,目錄名稱與cd命令之間存在一個空格。 一登陸Linux系統後,root會在root的家目錄!那回到上一層目錄可以用『 cd .. 』。 利用相對路徑的寫法必須要確認你目前的路徑才能正確的去到想要去的目錄。例如上表當中最後一個例子, 你必須要確認你是在/var/spool/mail當中,並且知道在/var/spool當中有個mqueue的目錄才行啊~ 這樣才能使用cd ../mqueue去到正確的目錄說,否則就要直接輸入cd /var/spool/mqueue羅~

 

其實,我們的提示字節,亦即那個 [root@www ~]# 當中,就已經有指出目前的目錄了, 剛登陸時會到自己的家目錄,而家目錄還有一個代碼,那就是『 ~ 』符號! 例如上面的例子可以發現,使用『 cd ~ 』可以回到個人的家目錄裏頭去呢! 另外,針對 cd 的使用方法,如果僅輸入 cd 時,代表的就是『 cd ~ 』的意思喔~ 亦即是會回到自己的家目錄啦!而那個『 cd - 』比較難以理解,請自行多做幾次練習, 就會比較明白了。

pwd (顯示目前所在的目錄)

[root@www ~]# pwd [-P]
選項與參數:
-P :顯示出確實的路徑,而非使用連結 (link) 路徑。

單純顯示出目前的工作目錄:

[root@www ~]# pwd
/root <== 顯示出目錄啦~

 

顯示出實際的工作目錄,而非連結檔本身的目錄名而已

複製代碼
[root@www ~]# cd /var/mail <==注意,/var/mail是一個連結檔
[root@www mail]# pwd
/var/mail <==列出目前的工作目錄
[root@www mail]# pwd -P
/var/spool/mail <==怎麼回事?有沒有加 -P 差很多~
[root@www mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail
# 看到這裏應該知道爲啥了吧?因爲 /var/mail 是連結檔,連結到 /var/spool/mail 
# 所以,加上 pwd -P 的選項後,會不以連結檔的數據顯示,而是顯示正確的完整路徑啊!
複製代碼

pwd是Print Working Directory的縮寫,也就是顯示目前所在目錄的命令, 例如在上個表格最後的目錄是/var/mail這個目錄,但是提示字節僅顯示mail, 如果你想要知道目前所在的目錄,可以輸入pwd即可。此外,由於很多的套件所使用的目錄名稱都相同,例如 /usr/local/etc還有/etc,但是通常Linux僅列出最後面那一個目錄而已,這個時候你就可以使用pwd 來知道你的所在目錄羅!免得搞錯目錄,結果...

 

其實有趣的是那個 -P 的選項啦!他可以讓我們取得正確的目錄名稱,而不是以連結檔的路徑來顯示的。 如果你使用的是CentOS 5.x的話,剛剛好/var/mail是/var/spool/mail的連結檔, 所以,透過到/var/mail下達pwd -P就能夠知道這個選項的意義羅~ ^_^

mkdir (創建新目錄)

[root@www ~]# mkdir [-mp] 目錄名稱
選項與參數:
-m :配置文件的權限喔!直接配置,不需要看默認權限 (umask) 的臉色~
-p :幫助你直接將所需要的目錄(包含上一級目錄)遞迴創建起來!

請到/tmp底下嘗試創建數個新目錄看看:

複製代碼
[root@www ~]# cd /tmp
[root@www tmp]# mkdir test <==創建一名爲 test 的新目錄
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4': 
No such file or directory <== 沒辦法直接創建此目錄啊!
[root@www tmp]# mkdir -p test1/test2/test3/test4
# 加了這個 -p 的選項,可以自行幫你創建多層目錄!
複製代碼

創建權限爲rwx--x--x的目錄

複製代碼
[root@www tmp]# mkdir -m 711 test2
[root@www tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
# 仔細看上面的權限部分,如果沒有加上 -m 來強制配置屬性,系統會使用默認屬性。
# 那麼你的默認屬性爲何?這要透過底下介紹的 umask 才能瞭解喔! ^_^
複製代碼

如果想要創建新的目錄的話,那麼就使用mkdir (make directory)吧! 不過,在默認的情況下, 你所需要的目錄得一層一層的創建才行!例如:假如你要創建一個目錄爲 /home/bird/testing/test1,那麼首先必須要有 /home 然後 /home/bird ,再來 /home/bird/testing 都必須要存在,纔可以創建 /home/bird/testing/test1 這個目錄!假如沒有 /home/bird/testing 時,就沒有辦法創建 test1 的目錄羅!\

不過,現在有個更簡單有效的方法啦!那就是加上 -p 這個選項喔!你可以直接下達:『 mkdir -p /home/bird/testing/test1 』 則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的創建起目錄!並且, 如果該目錄本來就已經存在時,系統也不會顯示錯誤信息喔!挺快樂的吧! ^_^。 不過鳥哥不建議常用-p這個選項,因爲擔心如果你打錯字,那麼目錄名稱就會變的亂七八糟的!


另外,有個地方你必須要先有概念,那就是『默認權限』的地方。我們可以利用 -m 來強制給予一個新的目錄相關的權限, 例如上表當中,我們給予 -m 711 來給予新的目錄 drwx--x--x 的權限。不過,如果沒有給予 -m 選項時, 那麼默認的新建目錄權限又是什麼呢?這個跟 umask 有關,我們在本章後頭會加以介紹的。 

rmdir (刪除『空』的目錄)

[root@www ~]# rmdir [-p] 目錄名稱
選項與參數:
-p :連同上一級『空的』目錄也一起刪除

 

 

將於mkdir範例中創建的目錄(/tmp底下)刪除掉!

複製代碼
[root@www tmp]# ls -l <==看看有多少目錄存在?
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
[root@www tmp]# rmdir test <==可直接刪除掉,沒問題
[root@www tmp]# rmdir test1 <==因爲尚有內容,所以無法刪除!
rmdir: `test1': Directory not empty
[root@www tmp]# rmdir -p test1/test2/test3/test4
[root@www tmp]# ls -l <==您看看,底下的輸出中test與test1不見了!
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
# 瞧!利用 -p 這個選項,立刻就可以將 test1/test2/test3/test4 一次刪除~
# 不過要注意的是,這個 rmdir 僅能『刪除空的目錄』喔!
複製代碼

如果想要刪除舊有的目錄時,就使用rmdir吧!例如將剛剛創建的test殺掉,使用『 rmdir test 』即可!請注意呦!目錄需要一層一層的刪除才行!而且被刪除的目錄裏面必定不能存在其他的目錄或文件! 這也是所謂的空的目錄(empty directory)的意思啊!那如果要將所有目錄下的東西都殺掉呢?! 這個時候就必須使用『 rm -r test 』羅!不過,還是使用 rmdir 比較不危險!你也可以嘗試以 -p 的選項加入,來刪除上一級的目錄喔!

 

文件與目錄的檢視: ls

複製代碼
[root@www ~]# ls [-aAdfFhilnrRSt] 目錄名稱
[root@www ~]# ls [--color={never,auto,always}] 目錄名稱
[root@www ~]# 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)
複製代碼

 

在Linux系統當中,這個 ls 命令可能是最常被運行的吧!因爲我們隨時都要知道文件或者是目錄的相關資訊啊~ 不過,我們Linux的文件所記錄的資訊實在是太多了,ls 沒有需要全部都列出來呢~ 所以,當你只有下達 ls 時,默認顯示的只有:非隱藏檔的檔名、 以檔名進行排序及檔名代表的顏色顯示如此而已。舉例來說, 你下達『 ls /etc 』之後,只有經過排序的檔名以及以藍色顯示目錄及白色顯示一般文件,如此而已。

 

將家目錄下的所有文件列出來(含屬性與隱藏檔)

複製代碼
[root@www ~]# ls -al ~
total 156
drwxr-x---  4 root root  4096 Sep 24 00:07 .
drwxr-xr-x 23 root root  4096 Sep 22 12:09 ..
-rw-------  1 root root  1474 Sep  4 18:27 anaconda-ks.cfg
-rw-------  1 root root   955 Sep 24 00:08 .bash_history
-rw-r--r--  1 root root    24 Jan  6  2007 .bash_logout
-rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
-rw-r--r--  1 root root   176 Jan  6  2007 .bashrc
drwx------  3 root root  4096 Sep  5 10:37 .gconf
-rw-r--r--  1 root root 42304 Sep  4 18:26 install.log
-rw-r--r--  1 root root  5661 Sep  4 18:25 install.log.syslog
# 這個時候你會看到以 . 爲開頭的幾個文件,以及目錄檔 (.) (..) .gconf 等等,
# 不過,目錄檔檔名都是以深藍色顯示,有點不容易看清楚就是了。
複製代碼

 

不顯示顏色,但在檔名末顯示出該檔名代表的類型(type)

複製代碼
[root@www ~]# ls -alF --color=never  ~
total 156
drwxr-x---  4 root root  4096 Sep 24 00:07 ./
drwxr-xr-x 23 root root  4096 Sep 22 12:09 ../
-rw-------  1 root root  1474 Sep  4 18:27 anaconda-ks.cfg
-rw-------  1 root root   955 Sep 24 00:08 .bash_history
-rw-r--r--  1 root root    24 Jan  6  2007 .bash_logout
-rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
-rw-r--r--  1 root root   176 Jan  6  2007 .bashrc
drwx------  3 root root  4096 Sep  5 10:37 .gconf/
-rw-r--r--  1 root root 42304 Sep  4 18:26 install.log
-rw-r--r--  1 root root  5661 Sep  4 18:25 install.log.syslog
# 注意看到顯示結果的第一行,嘿嘿~知道爲何我們會下達類似 ./command 
# 之類的命令了吧?因爲 ./ 代表的是『目前目錄下』的意思啊!至於什麼是 FIFO/Socket ?
# 請參考前一章節的介紹啊!另外,那個.bashrc 時間僅寫2007,能否知道詳細時間?
複製代碼

 

完整的呈現文件的修改時間 *(modification time)

複製代碼
[root@www ~]# ls -al --full-time  ~
total 156
drwxr-x---  4 root root  4096 2008-09-24 00:07:00.000000 +0800 .
drwxr-xr-x 23 root root  4096 2008-09-22 12:09:32.000000 +0800 ..
-rw-------  1 root root  1474 2008-09-04 18:27:10.000000 +0800 anaconda-ks.cfg
-rw-------  1 root root   955 2008-09-24 00:08:14.000000 +0800 .bash_history
-rw-r--r--  1 root root    24 2007-01-06 17:05:04.000000 +0800 .bash_logout
-rw-r--r--  1 root root   191 2007-01-06 17:05:04.000000 +0800 .bash_profile
-rw-r--r--  1 root root   176 2007-01-06 17:05:04.000000 +0800 .bashrc
drwx------  3 root root  4096 2008-09-05 10:37:49.000000 +0800 .gconf
-rw-r--r--  1 root root 42304 2008-09-04 18:26:57.000000 +0800 install.log
-rw-r--r--  1 root root  5661 2008-09-04 18:25:55.000000 +0800 install.log.syslog
# 請仔細看,上面的『時間』欄位變了喔!變成較爲完整的格式。
# 一般來說, ls -al 僅列出目前短格式的時間,有時不會列出年份,
# 藉由 --full-time 可以查閱到比較正確的完整時間格式啊!
複製代碼

其實 ls 的用法還有很多,包括查閱文件所在 i-node 號碼的 ls -i 選項,以及用來進行文件排序的 -S 選項,還有用來查閱不同時間的動作的 --time=atime 等選項(更多時間說明請參考本章後面touch的說明)。而這些選項的存在都是因爲 Linux 文件系統記錄了很多有用的資訊的緣故。那麼 Linux 的文件系統中,這些與權限、屬性有關的數據放在哪裏呢? 放在 i-node 裏面。關於這部分,我們會在下一章繼續爲你作比較深入的介紹啊!

無論如何, ls 最常被使用到的功能還是那個 -l 的選項,爲此,很多 distribution 在默認的情況中, 已經將 ll (L 的小寫) 配置成爲 ls -l 的意思了!其實,那個功能是 Bash shell 的 alias 功能呢~也就是說,我們直接輸入 ll 就等於是輸入 ls -l 是一樣的~關於這部分,我們會在後續 bash shell 時再次的強調滴~

 

cp (複製文件或目錄)

複製代碼
[root@www ~]# cp [-adfilprsu] 來源檔(source) 目標檔(destination)
[root@www ~]# cp [options] source1 source2 source3 .... directory
選項與參數:
-a  :相當於 -pdr 的意思,至於 pdr 請參考下列說明;(常用)
-d  :若來源檔爲連結檔的屬性(link file),則複製連結檔屬性而非文件本身;
-f  :爲強制(force)的意思,若目標文件已經存在且無法開啓,則移除後再嘗試一次;
-i  :若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
-l  :進行硬式連結(hard link)的連結檔創建,而非複製文件本身;
-p  :連同文件的屬性一起復制過去,而非使用默認屬性(備份常用);
-r  :遞迴持續複製,用於目錄的複製行爲;(常用)
-s  :複製成爲符號連結檔 (symbolic link),亦即『捷徑』文件;
-u  :若 destination 比 source 舊才升級 destination !
最後需要注意的,如果來源檔有兩個以上,則最後一個目的檔一定要是『目錄』才行!
複製代碼

複製(cp)這個命令是非常重要的,不同身份者運行這個命令會有不同的結果產生,尤其是那個-a, -p的選項, 對於不同身份來說,差異則非常的大!

 

用root身份,將家目錄下的 .bashrc 複製到 /tmp 下,並更名爲 bashrc

[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆蓋,y爲覆蓋
# 重複作兩次動作,由於 /tmp 底下已經存在 bashrc 了,加上 -i 選項後,
# 則在覆蓋前會詢問使用者是否確定!可以按下 n 或者 y 來二次確認呢!

 

變換目錄到/tmp,並將/var/log/wtmp複製到/tmp且觀察屬性:

複製代碼
[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要複製到目前的目錄,最後的 . 不要忘
[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp
# 注意上面的特殊字體,在不加任何選項的情況下,文件的某些屬性/權限會改變;
# 這是個很重要的特性!要注意喔!還有,連文件創建的時間也不一樣了!
# 那如果你想要將文件的所有特性都一起復制過來該怎辦?可以加上 -a 喔!如下所示:

[root@www tmp]# cp -a /var/log/wtmp wtmp_2
[root@www tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整個數據特性完全一模一樣ㄟ!真是不賴~這就是 -a 的特性!
複製代碼

這個 cp 的功能很多,由於我們常常會進行一些數據的複製,所以也會常常用到這個命令的。 一般來說,我們如果去複製別人的數據 (當然,該文件你必須要有 read 的權限才行啊! ^_^) 時, 總是希望複製到的數據最後是我們自己的,所以,在默認的條件中, cp 的來源檔與目的檔的權限是不同的,目的檔的擁有者通常會是命令操作者本身。舉例來說, 上面的範例中,由於我是 root 的身份,因此複製過來的文件擁有者與羣組就改變成爲 root 所有了! 這樣說,可以明白嗎?^_^

由於具有這個特性,因此當我們在進行備份的時候,某些需要特別注意的特殊權限文件, 例如密碼檔 (/etc/shadow) 以及一些配置檔,就不能直接以 cp 來複制,而必須要加上 -a 或者是 -p 等等可以完整複製文件權限的選項才行!另外,如果你想要複製文件給其他的使用者, 也必須要注意到文件的權限(包含讀、寫、運行以及文件擁有者等等), 否則,其他人還是無法針對你給予的文件進行修訂的動作喔!注意注意!

 

複製 /etc/ 這個目錄下的所有內容到 /tmp 底下

[root@www tmp]# cp /etc/ /tmp
cp: omitting directory `/etc'   <== 如果是目錄則不能直接複製,要加上 -r 的選項
[root@www tmp]# cp -r /etc/ /tmp
# 還是要再次的強調喔! -r 是可以複製目錄,但是,文件與目錄的權限可能會被改變
# 所以,也可以利用『 cp -a /etc /tmp 』來下達命令喔!尤其是在備份的情況下!

 

將複製的 bashrc 創建一個連結檔 (symbolic link)

複製代碼
[root@www tmp]# ls -l bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc  <==先觀察一下文件情況
[root@www tmp]# cp -s bashrc bashrc_slink
[root@www tmp]# cp -l bashrc bashrc_hlink
[root@www tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc  <==與原始文件不太一樣了!
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink
lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc
複製代碼

使用 -l 及 -s 都會創建所謂的連結檔(link file),但是這兩種連結檔卻有不一樣的情況。這是怎麼一回事啊? 那個 -l 就是所謂的實體連結(hard link),至於 -s 則是符號連結(symbolic link), 簡單來說,bashrc_slink 是一個『捷徑』,這個捷徑會連結到bashrc去!所以你會看到檔名右側會有個指向(->)的符號!

至於bashrc_hlink文件與bashrc的屬性與權限完全一模一樣,與尚未進行連結前的差異則是第二欄的link數由1變成2了!

 

若 ~/.bashrc 比 /tmp/bashrc 新才複製過來

複製代碼
[root@www tmp]# cp -u ~/.bashrc /tmp/bashrc
# 這個 -u 的特性,是在目標文件與來源文件有差異時,纔會複製的。
# 所以,比較常被用於『備份』的工作當中喔! ^_^

範例六:將範例四造成的 bashrc_slink 複製成爲 bashrc_slink_1 與bashrc_slink_2
[root@www tmp]# cp bashrc_slink bashrc_slink_1
[root@www tmp]# cp -d bashrc_slink bashrc_slink_2
[root@www tmp]# ls -l bashrc bashrc_slink*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc
lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1       <==與原始文件相同
lrwxrwxrwx 1 root root   6 Sep 24 14:33 bashrc_slink_2 -> bashrc <==是連結檔!
# 這個例子也是很有趣喔!原本複製的是連結檔,但是卻將連結檔的實際文件複製過來了
# 也就是說,如果沒有加上任何選項時,cp複製的是原始文件,而非連結檔的屬性!
# 若要複製連結檔的屬性,就得要使用 -d 的選項了!如 bashrc_slink_2 所示。
複製代碼

 

將家目錄的 .bashrc 及 .bash_history 複製到 /tmp 底下

[root@www tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 可以將多個數據一次複製到同一個目錄去!最後面一定是目錄!

 

總之,由於 cp 有種種的文件屬性與權限的特性,所以,在複製時,你必須要清楚的瞭解到:

  • 是否需要完整的保留來源文件的資訊?
  • 來源文件是否爲連結檔 (symbolic link file)?
  • 來源檔是否爲特殊的文件,例如 FIFO, socket 等?
  • 來源檔是否爲目錄?

rm (移除文件或目錄)

root@www ~]# rm [-fir] 文件或目錄
選項與參數:
-f  :就是 force 的意思,忽略不存在的文件,不會出現警告信息;
-i  :互動模式,在刪除前會詢問使用者是否動作
-r  :遞迴刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!

 

將剛剛在 cp 的範例中創建的 bashrc 刪除掉!

[root@www ~]# cd /tmp
[root@www tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!

 

將剛剛在 cp 的範例中創建的 bashrc 刪除掉!

[root@www ~]# cd /tmp
[root@www tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!

 

透過萬用字節*的幫忙,將/tmp底下開頭爲bashrc的檔名通通刪除:

[root@www tmp]# rm -i bashrc*
# 注意那個星號,代表的是 0 到無窮多個任意字節喔!很好用的東西!

將 cp 範例中所創建的 /tmp/etc/ 這個目錄刪除掉!

複製代碼
[root@www tmp]# rmdir /tmp/etc
rmdir: etc: Directory not empty  <== 刪不掉啊!因爲這不是空的目錄!
[root@www tmp]# rm -r /tmp/etc
rm: descend into directory `/tmp/etc'? y
....(中間省略)....
# 因爲身份是 root ,默認已經加入了 -i 的選項,所以你要一直按 y 纔會刪除!
# 如果不想要繼續按 y ,可以按下『 [ctrl]-c 』來結束 rm 的工作。
# 這是一種保護的動作,如果確定要刪除掉此目錄而不要詢問,可以這樣做:
[root@www tmp]# \rm -r /tmp/etc
# 在命令前加上反斜線,可以忽略掉 alias 的指定選項喔!至於 alias 我們在bash再談!
複製代碼

 

刪除一個帶有 - 開頭的文件

[root@www tmp]# touch ./-aaa-  <==touch這個命令可以創建空文件!
[root@www tmp]# ls -l 
-rw-r--r-- 1 root  root      0 Sep 24 15:03 -aaa-  <==文件大小爲0,所以是空文件
[root@www tmp]# rm -aaa-
Try `rm --help' for more information.  <== 因爲 "-" 是選項嘛!所以系統誤判了!
[root@www tmp]# rm ./-aaa-

這是移除的命令(remove),要注意的是,通常在Linux系統下,爲了怕文件被誤殺,所以很多 distributions 都已經默認加入 -i 這個選項了!而如果要連目錄下的東西都一起殺掉的話, 例如子目錄裏面還有子目錄時,那就要使用 -r 這個選項了!不過,使用『 rm -r 』這個命令之前,請千萬注意了,因爲該目錄或文件『肯定』會被 root 殺掉!因爲系統不會再次詢問你是否要砍掉呦!所以那是個超級嚴重的命令下達呦! 得特別注意!不過,如果你確定該目錄不要了,那麼使用 rm -r 來循環殺掉是不錯的方式!

mv (移動文件與目錄,或更名)

[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory
選項與參數:
-f :force 強制的意思,如果目標文件已經存在,不會詢問而直接覆蓋;
-i :若目標文件 (destination) 已經存在時,就會詢問是否覆蓋!
-u :若目標文件已經存在,且 source 比較新,纔會升級 (update)

 

複製一文件,創建一目錄,將文件移動到目錄中

[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest
# 將某個文件移動到某個目錄去,就是這樣做!

 

將剛剛的目錄名稱更名爲 mvtest2

[root@www tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡單~
# 其實在 Linux 底下還有個有趣的命令,名稱爲 rename ,
# 該命令專職進行多個檔名的同時更名,並非針對單一檔名變更,與mv不同。請man rename。

 

再創建兩個文件,再全部移動到 /tmp/mvtest2 當中

[root@www tmp]# cp ~/.bashrc bashrc1
[root@www tmp]# cp ~/.bashrc bashrc2
[root@www tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到這邊,如果有多個來源文件或目錄,則最後一個目標檔一定是『目錄!』
# 意思是說,將所有的數據移動到該目錄的意思!

 

這是搬移 (move) 的意思!當你要移動文件或目錄的時後,呵呵!這個命令就很重要啦! 同樣的,你也可以使用 -u ( update )來測試新舊文件,看看是否需要搬移羅! 另外一個用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一個文件的檔名呢!不過,在 Linux 纔有的命令當中,有個 rename , 可以用來更改大量文件的檔名,你可以利用 man rename 來查閱一下,也是挺有趣的命令喔!

 

 

cat (concatenate)

複製代碼
[root@www ~]# cat [-AbEnTv]
選項與參數:
-A :相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已;
-b :列出行號,僅針對非空白行做行號顯示,空白行不標行號!
-E :將結尾的斷行字節 $ 顯示出來;
-n :列印出行號,連同空白行也會有行號,與 -b 的選項不同;
-T :將 [tab] 按鍵以 ^I 顯示出來;
-v :列出一些看不出來的特殊字符
複製代碼

 

檢閱 /etc/issue 這個文件的內容

[root@www ~]# cat /etc/issue
CentOS release 5.3 (Final)
Kernel \r on an \m

 

如果還要加印行號呢?

[root@www ~]# cat -n /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
3
# 看到了吧!可以印出行號呢!這對於大文件要找某個特定的行時,有點用處!
# 如果不想要編排空白行的行號,可以使用『cat -b /etc/issue』

 

將 /etc/xinetd.conf 的內容完整的顯示出來(包含特殊字節)

複製代碼
[root@www ~]# cat -A /etc/xinetd.conf
#$
....(中間省略)....
$
defaults$
{$
# The next two items are intended to be a quick access place to$
....(中間省略)....
^Ilog_type^I= SYSLOG daemon info $
^Ilog_on_failure^I= HOST$
^Ilog_on_success^I= PID HOST DURATION EXIT$
....(中間省略)....
includedir /etc/xinetd.d$
$
# 上面的結果限於篇幅,鳥哥刪除掉很多數據了。另外,輸出的結果並不會有特殊字體,
# 鳥哥上面的特殊字體是要讓您發現差異點在哪裏就是了。基本上,在一般的環境中,
# 使用 [tab] 與空白鍵的效果差不多,都是一堆空白啊!我們無法知道兩者的差別。
# 此時使用 cat -A 就能夠發現那些空白的地方是啥鬼東西了![tab]會以 ^I 表示,
# 斷行字節則是以 $ 表示,所以你可以發現每一行後面都是 $ 啊!不過斷行字節
# 在Windows/Linux則不太相同,Windows的斷行字節是 ^M$ 羅。
# 這部分我們會在第十章 vim 軟件的介紹時,再次的說明到喔!
複製代碼

嘿嘿!Linux 裏面有『貓』命令?喔!不是的, cat 是 Concatenate (連續)的簡寫, 主要的功能是將一個文件的內容連續的印出在螢幕上面!例如上面的例子中,我們將 /etc/issue 印出來!如果加上 -n 或 -b 的話,則每一行前面還會加上行號呦!

鳥哥個人是比較少用 cat 啦!畢竟當你的文件內容的行數超過 40 行以上,嘿嘿!根本來不及在螢幕上看到結果! 所以,配合等一下要介紹的 more 或者是 less 來運行比較好!此外,如果是一般的 DOS 文件時,就需要特別留意一些奇奇怪怪的符號了, 例如斷行與 [tab] 等,要顯示出來,就得加入 -A 之類的選項了!


tac (反向列示)

[root@www ~]# tac /etc/issue

Kernel \r on an \m
CentOS release 5.3 (Final)
# 嘿嘿!與剛剛上面的範例一比較,是由最後一行先顯示喔!

 

tac 這個好玩了!怎麼說呢?詳細的看一下, cat 與 tac ,有沒有發現呀!對啦! tac 剛好是將 cat 反寫過來,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最後一行連續顯示在螢幕上』,而 tac 則是『 由最後一行到第一行反向在螢幕上顯示出來 』,很好玩吧!


nl (添加行號列印)

複製代碼
[root@www ~]# nl [-bnw] 文件
選項與參數:
-b :指定行號指定的方式,主要有兩種:
-b a :表示不論是否爲空行,也同樣列出行號(類似 cat -n);
-b t :如果有空行,空的那一行不要列出行號(默認值);
-n :列出行號表示的方法,主要有三種:
-n ln :行號在螢幕的最左方顯示;
-n rn :行號在自己欄位的最右方顯示,且不加 0 ;
-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-w :行號欄位的佔用的位數。
複製代碼

 

用 nl 列出 /etc/issue 的內容

複製代碼
[root@www ~]# nl -b a -n rz /etc/issue
000001 CentOS release 5.3 (Final)
000002 Kernel \r on an \m
000003
# 嘿嘿!自動在自己欄位的地方補上 0 了~默認欄位是六位數,如果想要改成 3 位數?

[root@www ~]# nl -b a -n rz -w 3 /etc/issue
001 CentOS release 5.3 (Final)
002 Kernel \r on an \m
003
# 變成僅有 3 位數羅~
複製代碼

nl 可以將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能呢。

 

more (一頁一頁翻動)

複製代碼
[root@www ~]# more /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中間省略)....
--More--(28%) <== 重點在這一行喔!你的光標也會在這裏等待你的命令
複製代碼

仔細的給他看到上面的範例,如果 more 後面接的文件內容行數大於螢幕輸出的行數時, 就會出現類似上面的圖示。重點在最後一行,最後一行會顯示出目前顯示的百分比, 而且還可以在最後一行輸入一些有用的命令喔!在 more 這個程序的運行過程中,你有幾個按鍵可以按的:

空白鍵 (space):代表向下翻一頁;
Enter :代表向下翻『一行』;
/字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
:f :立刻顯示出檔名以及目前顯示的行數;
q :代表立刻離開 more ,不再顯示該文件內容。
b 或 [ctrl]-b :代表往回翻頁,不過這動作只對文件有用,對管線無用。
要離開 more 這個命令的顯示工作,可以按下 q 就能夠離開了。而要向下翻頁,就使用空白鍵即可。

比較有用的是搜尋字串的功能,舉例來說,我們使用『 more /etc/man.config 』來觀察該文件, 若想要在該文件內搜尋 MANPATH 這個字串時,可以這樣做:

複製代碼
[root@www ~]# more /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中間省略)....
/MANPATH <== 輸入了 / 之後,光標就會自動跑到最底下一行等待輸入!
複製代碼

如同上面的說明,輸入了 / 之後,光標就會跑到最底下一行,並且等待你的輸入, 你輸入了字串並按下[enter]之後,嘿嘿! more 就會開始向下搜尋該字串羅~而重複搜尋同一個字串, 可以直接按下 n 即可啊!最後,不想要看了,就按下 q 即可離開 more 啦!


less (一頁一頁翻動)

複製代碼
[root@www ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中間省略)....
: <== 這裏可以等待你輸入命令!
複製代碼

less 的用法比起 more 又更加的有彈性,怎麼說呢?在 more 的時候,我們並沒有辦法向前面翻, 只能往後面看,但若使用了 less 時,呵呵!就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件,你瞧,是不是更容易使用來觀看一個文件的內容了呢!

除此之外,在 less 裏頭可以擁有更多的『搜尋』功能喔!不止可以向下搜尋,也可以向上搜尋~ 實在是很不錯用~基本上,可以輸入的命令有:

空白鍵 :向下翻動一頁;
[pagedown]:向下翻動一頁;
[pageup] :向上翻動一頁;
/字串 :向下搜尋『字串』的功能;
?字串 :向上搜尋『字串』的功能;
n :重複前一個搜尋 (與 / 或 ? 有關!)
N :反向的重複前一個搜尋 (與 / 或 ? 有關!)
q :離開 less 這個程序;
查閱文件內容還可以進行搜尋的動作~瞧~ less 是否很不錯用啊! 其實 less 還有很多的功能喔!詳細的使用方式請使用 man less 查詢一下啊! ^_^

你是否會覺得 less 使用的畫面與環境與 man page 非常的類似呢?沒錯啦!因爲man這個命令就是呼叫 less 來顯示說明文件的內容的! 現在你是否覺得 less 很重要呢? ^_^

 

head (取出前面幾行)

[root@www ~]# head [-n number] 文件 
選項與參數:
-n :後面接數字,代表顯示幾行的意思
[root@www ~]# head /etc/man.config
# 默認的情況中,顯示前面十行!若要顯示前 20 行,就得要這樣:
[root@www ~]# head -n 20 /etc/man.config

 

如果後面100行的數據都不列印,只列印/etc/man.config的前面幾行,該如何是好?

[root@www ~]# head -n -100 /etc/man.config

head 的英文意思就是『頭』啦,那麼這個東西的用法自然就是顯示出一個文件的前幾行羅! 沒錯!就是這樣!若沒有加上 -n 這個選項時,默認只顯示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!

另外那個 -n 選項後面的參數較有趣,如果接的是負數,例如上面範例的-n -100時,代表列前的所有行數, 但不包括後面100行。舉例來說,/etc/man.config共有141行,則上述的命令『head -n -100 /etc/man.config』 就會列出前面41行,後面100行不會列印出來了。這樣說,比較容易懂了吧? ^_^


tail (取出後面幾行)

複製代碼
[root@www ~]# tail [-n number] 文件 
選項與參數:
-n :後面接數字,代表顯示幾行的意思
-f :表示持續偵測後面所接的檔名,要等到按下[ctrl]-c纔會結束tail的偵測

[root@www ~]# tail /etc/man.config
# 默認的情況中,顯示最後的十行!若要顯示最後的 20 行,就得要這樣:
[root@www ~]# tail -n 20 /etc/man.config
複製代碼

 

如果不知道/etc/man.config有幾行,卻只想列出100行以後的數據時?

[root@www ~]# tail -n +100 /etc/man.config

其實與head -n -xx有異曲同工之妙。當下達『tail -n +100 /etc/man.config』 代表該文件從100行以後都會被列出來,同樣的,在man.config共有141行,因此第100~141行就會被列出來啦! 前面的99行都不會被顯示出來喔!

 

持續偵測/var/log/messages的內容

[root@www ~]# tail -f /var/log/messages
<==要等到輸入[crtl]-c之後纔會離開tail這個命令的偵測!

 

由於/var/log/messages隨時會有數據寫入,你想要讓該文件有數據寫入時就立刻顯示到螢幕上, 就利用 -f 這個選項,他可以一直偵測/var/log/messages這個文件,新加入的數據都會被顯示到螢幕上。 直到你按下[crtl]-c纔會離開tail的偵測喔!

 

touch

我們在 ls 這個命令的介紹時,有稍微提到每個文件在linux底下都會記錄許多的時間參數, 其實是有三個主要的變動時間,那麼三個時間的意義是什麼呢?

複製代碼
modification time (mtime):
當該文件的『內容數據』變更時,就會升級這個時間!內容數據指的是文件的內容,而不是文件的屬性或權限喔!

status time (ctime):
當該文件的『狀態 (status)』改變時,就會升級這個時間,舉例來說,像是權限與屬性被更改了,都會升級這個時間啊。

access time (atime):
當『該文件的內容被取用』時,就會升級這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/man.config , 就會升級該文件的 atime 了。
複製代碼

 

我們來看一看你自己的 /etc/man.config 這個文件的時間吧!

[root@www ~]# ls -l /etc/man.config
-rw-r--r-- 1 root root 4617 Jan 6 2007 /etc/man.config
[root@www ~]# ls -l --time=atime /etc/man.config
-rw-r--r-- 1 root root 4617 Sep 25 17:54 /etc/man.config
[root@www ~]# ls -l --time=ctime /etc/man.config
-rw-r--r-- 1 root root 4617 Sep 4 18:03 /etc/man.config

看到了嗎?在默認的情況下,ls 顯示出來的是該文件的 mtime ,也就是這個文件的內容上次被更動的時間。 至於鳥哥的系統是在 9 月 4 號的時候安裝的,因此,這個文件被產生導致狀態被更動的時間就回溯到那個時間點了(ctime)! 而還記得剛剛我們使用的範例當中,有使用到man.config這個文件啊,所以啊,他的 atime 就會變成剛剛使用的時間了!

文件的時間是很重要的,因爲,如果文件的時間誤判的話,可能會造成某些程序無法順利的運行。 OK!那麼萬一我發現了一個文件來自未來,該如何讓該文件的時間變成『現在』的時刻呢? 很簡單啊!就用『touch』這個命令即可!

複製代碼
[root@www ~]# touch [-acdmt] 文件
選項與參數:
-a :僅修訂 access time;
-c :僅修改文件的時間,若該文件不存在則不創建新文件;
-d :後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間"
-m :僅修改 mtime ;
-t :後面可以接欲修訂的時間而不用目前的時間,格式爲[YYMMDDhhmm]
複製代碼

 

新建一個空的文件並觀察時間

複製代碼
[root@www ~]# cd /tmp
[root@www tmp]# touch testtouch
[root@www tmp]# ls -l testtouch
-rw-r--r-- 1 root root 0 Sep 25 21:09 testtouch
# 注意到,這個文件的大小是 0 呢!在默認的狀態下,如果 touch 後面有接文件,
# 則該文件的三個時間 (atime/ctime/mtime) 都會升級爲目前的時間。若該文件不存在,
# 則會主動的創建一個新的空的文件喔!例如上面這個例子!
複製代碼

 

將 ~/.bashrc 複製成爲 bashrc,假設複製完全的屬性,檢查其日期

[root@www tmp]# cp -a ~/.bashrc bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Jan 6 2007 bashrc <==這是 mtime
-rw-r--r-- 1 root root 176 Sep 25 21:11 bashrc <==這是 atime
-rw-r--r-- 1 root root 176 Sep 25 21:12 bashrc <==這是 ctime

 

在上面這個案例當中我們使用了『ll』這個命令(兩個英文L的小寫),這個命令其實就是『ls -l』的意思, ll本身不存在,是被『做出來』的一個命令別名。相關的命令別名我們會在bash章節當中詳談的,這裏先知道ll="ls -l"即可。 至於分號『 ; 』則代表連續命令的下達啦!你可以在一行命令當中寫入多重命令, 這些命令可以『依序』運行。由上面的命令我們會知道ll那一行有三個命令被下達在同一行中。

至於運行的結果當中,我們可以發現數據的內容與屬性是被複制過來的,因此文件內容時間(mtime)與原本文件相同。 但是由於這個文件是剛剛被創建的,因此狀態(ctime)與讀取時間就便呈現在的時間啦! 那如果你想要變更這個文件的時間呢?可以這樣做:

複製代碼
修改案例二的 bashrc 文件,將日期調整爲兩天前
[root@www tmp]# touch -d "2 days ago" bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc
-rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc
-rw-r--r-- 1 root root 176 Sep 25 21:23 bashrc
# 跟上個範例比較看看,本來是 25 日的變成了 23 日了 (atime/mtime)~
# 不過, ctime 並沒有跟著改變喔!
複製代碼

 

將上個範例的 bashrc 日期改爲 2007/09/15 2:02

[root@www tmp]# touch -t 0709150202 bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Sep 15 2007 bashrc
-rw-r--r-- 1 root root 176 Sep 15 2007 bashrc
-rw-r--r-- 1 root root 176 Sep 25 21:25 bashrc
# 注意看看,日期在 atime 與 mtime 都改變了,但是 ctime 則是記錄目前的時間!

透過 touch 這個命令,我們可以輕易的修訂文件的日期與時間。並且也可以創建一個空的文件喔! 不過,要注意的是,即使我們複製一個文件時,複製所有的屬性,但也沒有辦法複製 ctime 這個屬性的。 ctime 可以記錄這個文件最近的狀態 (status) 被改變的時間。無論如何,還是要告知大家, 我們平時看的文件屬性中,比較重要的還是屬於那個 mtime 啊!我們關心的常常是這個文件的『內容』 是什麼時候被更動的說~了乎?

無論如何, touch 這個命令最常被使用的情況是:

  1. 創建一個空的文件;
  2. 將某個文件日期修訂爲目前 (mtime 與 atime)
發佈了72 篇原創文章 · 獲贊 108 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章