本節節選自鳥哥的 Linux 私房菜 -- 基礎學習篇目錄 第七章、Linux 文件與目錄管理
ls(文件與目錄的檢視)ls命令就是list的縮寫,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)
最常用的是ls –l,很多 linux的版本在默認的情況中, 已經將 ll (L 的小寫) 配置成為 ls -l 的意思了!其實,那個功能是 Bash shell 的 alias 功能呢~也就是說,我們直接輸入 ll 就等於是輸入 ls -l 是一樣的
例一:-al顯示所有的文件,隱藏的也顯示[root@localhost ~]# ls -altotal 52dr-xr-x---. 2 root root 4096 Nov 3 20:06 .dr-xr-xr-x. 22 root root 4096 Nov 14 16:08 ..-rw-------. 1 root root 1098 Nov 3 19:57 anaconda-ks.cfg-rw-------. 1 root root 1483 Dec 11 12:16 .bash_history-rw-r--r--. 1 root root 18 May 20 2009 .bash_logout-rw-r--r--. 1 root root 176 May 20 2009 .bash_PRofile-rw-r--r--. 1 root root 176 Sep 23 2004 .bashrc-rw-r--r--. 1 root root 100 Sep 23 2004 .cshrc-rw-r--r--. 1 root root 8726 Nov 3 19:57 install.log-rw-r--r--. 1 root root 3190 Nov 3 19:56 install.log.syslog-rw-r--r--. 1 root root 129 Dec 4 2004 .tcshrc 例二:-l 顯示文件,隱藏的不顯示[root@localhost ~]# ls -ltotal 20-rw-------. 1 root root 1098 Nov 3 19:57 anaconda-ks.cfg-rw-r--r--. 1 root root 8726 Nov 3 19:57 install.log-rw-r--r--. 1 root root 3190 Nov 3 19:56 install.log.syslog例三:ll 同ls -l[root@localhost ~]# lltotal 20-rw-------. 1 root root 1098 Nov 3 19:57 anaconda-ks.cfg-rw-r--r--. 1 root root 8726 Nov 3 19:57 install.log-rw-r--r--. 1 root root 3190 Nov 3 19:56 install.log.syslogcp (復制文件或目錄)
要復制文件,請使用 cp (copy) 這個命令即可~不過, 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/bashrccp: 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 的特性!
一般來說,我們如果去復制別人的數據 (當然,該文件你必須要有 read 的權限才行??! ^_^) 時, 總是希望復制到的數據最后是我們自己的,所以,在默認的條件中, cp 的來源檔與目的檔的權限是不同的,目的檔的擁有者通常會是命令操作者本身。舉例來說, 上面的范例二中,由於我是 root 的身份,因此復制過來的文件擁有者與群組就改變成為 root 所有了!
由於具有這個特性,因此當我們在進行備份的時候,某些需要特別注意的特殊權限文件, 例如密碼檔 (/etc/shadow) 以及一些配置檔,就不能直接以 cp 來復制,而必須要加上 -a 或者是 -p 等等可以完整復制文件權限的選項才行!另外,如果你想要復制文件給其他的使用者, 也必須要注意到文件的權限(包含讀、寫、運行以及文件擁有者等等), 否則,其他人還是無法針對你給予的文件進行修訂的動作喔!注意注意!
范例三:復制 /etc/ 這個目錄下的所有內容到 /tmp 底下[root@www tmp]# cp /etc/ /tmpcp: 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_hlinklrwxrwxrwx 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 bashrclrwxrwxrwx 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# 可以將多個數據一次復制到同一個目錄去!最后面一定是目錄!
例題:你能否使用vbird的身份,完整的復制/var/log/wtmp文件到/tmp底下,并更名為vbird_wtmp呢?
答:實際做看看的結果如下:
[vbird@www ~]$ cp -a /var/log/wtmp /tmp/vbird_wtmp[vbird@www ~]$ ls -l /var/log/wtmp /tmp/vbird_wtmp-rw-rw-r-- 1 vbird vbird 96384 9月 24 11:54 /tmp/vbird_wtmp-rw-rw-r-- 1 root utmp 96384 9月 24 11:54 /var/log/wtmp
由於vbird的身份并不能隨意修改文件的擁有者與群組,因此雖然能夠復制wtmp的相關權限與時間等屬性, 但是與擁有者、群組相關的,原本vbird身份無法進行的動作,即使加上 -a 選項,也是無法達成完整復制權限的!
總之,由於 cp 有種種的文件屬性與權限的特性,所以,在復制時,你必須要清楚的了解到:
這是搬移 (move) 的意思!當你要移動文件或目錄的時后,呵呵!這個命令就很重要啦!
[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# 注意到這邊,如果有多個來源文件或目錄,則最后一個目標檔一定是『目錄!』# 意思是說,將所有的數據移動到該目錄的意思!rm (移除文件或目錄)
這是移除的命令(remove),要注意的是,通常在Linux系統下,為了怕文件被誤殺,所以很多 distributions 都已經默認加入 -i 這個選項了!而如果要連目錄下的東西都一起殺掉的話, 例如子目錄里面還有子目錄時,那就要使用 -r 這個選項了!不過,使用『 rm -r 』這個命令之前,請千萬注意了,因為該目錄或文件『肯定』會被 root 殺掉!因為系統不會再次詢問你是否要砍掉呦!所以那是個超級嚴重的命令下達呦! 得特別注意!不過,如果你確定該目錄不要了,那么使用 rm -r 來循環殺掉是不錯的方式!
[root@www ~]# rm [-fir] 文件或目錄選項與參數:-f :就是 force 的意思,忽略不存在的文件,不會出現警告信息;-i :互動模式,在刪除前會詢問使用者是否動作-r :遞回刪除??!最常用在目錄的刪除了!這是非常危險的選項?。。》独唬簩倓傇?cp 的范例中創建的 bashrc 刪除掉![root@www ~]# cd /tmp[root@www tmp]# rm -i bashrcrm: remove regular file `bashrc'? y# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!范例二:透過萬用字節*的幫忙,將/tmp底下開頭為bashrc的檔名通通刪除:[root@www tmp]# rm -i bashrc*# 注意那個星號,代表的是 0 到無窮多個任意字節喔!很好用的東西!范例三:將 cp 范例中所創建的 /tmp/etc/ 這個目錄刪除掉![root@www tmp]# rmdir /tmp/etcrmdir: etc: Directory not empty <== 刪不掉啊!因為這不是空的目錄![root@www tmp]# rm -r /tmp/etcrm: 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-
另外,范例四也是很有趣的例子,我們在之前就談過,檔名最好不要使用 "-" 號開頭, 因為 "-" 后面接的是選項,因此,單純的使用『 rm -aaa- 』系統的命令就會誤判啦! 那如果使用后面會談到的正規表示法時,還是會出問題的!所以,只能用避過首位字節是 "-" 的方法啦! 就是加上本目錄『 ./ 』即可!如果 man rm 的話,其實還有一種方法,那就是『 rm -- -aaa- 』也可以??!
新聞熱點
疑難解答