linux 基本命令详解 ls,cp, rm, mv

上一篇 / 下一篇  2010-04-01 11:26:10 / 个人分类:linux

檔案與目錄管理:

談了談目錄與路徑之後,再來討論一下關於檔案的一些基本管理吧!檔案與目錄的管理上,不外乎『顯示屬性』、 『拷貝』、『刪除檔案』及『移動檔案或目錄』等等,由於檔案與目錄的管理在 Linux 當中是很重要的, 尤其是每個人自己家目錄的資料也都需要注意管理!所以我們來談一談有關檔案與目錄的一些基礎管理部分吧!


小標題的圖示檔案與目錄的檢視: 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 』之後,只有經過排序的檔名以及以藍色顯示目錄及白色顯示一般檔案,如此而已。

那如果我還想要加入其他的顯示資訊時,可以加入上頭提到的那些有用的選項呢~ 舉例來說,我們之前一直用到的 -l 這個長串顯示資料內容,以及將隱藏檔也一起列示出來的 -a 選項等等。 底下則是一些常用的範例,實際試做看看:

範例一:將家目錄下的所有檔案列出來(含屬性與隱藏檔)[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 shellalias功能呢~也就是說,我們直接輸入 ll 就等於是輸入 ls -l 是一樣的~關於這部分,我們會在後續 bash shell 時再次的強調滴~


小標題的圖示複製、刪除與移動: cp, rm, mv

要複製檔案,請使用cp (copy)這個指令即可~不過, cp 這個指令的用途可多了~ 除了單純的複製之外,還可以建立連結檔 (就是捷徑囉),比對兩檔案的新舊而予以更新, 以及複製整個目錄等等的功能呢!至於移動目錄與檔案,則使用mv (move),這個指令也可以直接拿來作更名 (rename) 的動作喔!至於移除嗎?那就是rm (remove)這個指令囉~底下我們就來瞧一瞧先~


  • 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有的身份為一般帳號(在我這裡用vbird這個帳號), 練習時請特別注意身份的差別喔!好!開始來做複製的練習與觀察:

範例一:用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 rootutmp96384 Sep 2411:54/var/log/wtmp-rw-r--r--1 rootroot96384 Sep 2414:06wtmp# 注意上面的特殊字體,在不加任何選項的情況下,檔案的某些屬性/權限會改變;
# 這是個很重要的特性!要注意喔!還有,連檔案建立的時間也不一樣了!
# 那如果你想要將檔案的所有特性都一起複製過來該怎辦?可以加上 -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/ /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--2root root 176 Sep 24 14:02 bashrc<==與原始檔案不太一樣了!-rw-r--r--2root 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了! 鳥哥這裡先不介紹實體連結,因為實體連結涉及 i-node 的相關知識,我們下一章談到檔案系統(filesystem)時再來討論這個問題。

範例五:若 ~/.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# 可以將多個資料一次複製到同一個目錄去!最後面一定是目錄!
例題:
你能否使用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-- 1vbird vbird96384  9月 24 11:54 /tmp/vbird_wtmp
-rw-rw-r-- 1root  utmp96384  9月 24 11:54 /var/log/wtmp
由於vbird的身份並不能隨意修改檔案的擁有者與群組,因此雖然能夠複製wtmp的相關權限與時間等屬性,但是與擁有者、群組相關的,原本vbird身份無法進行的動作,即使加上 -a 選項,也是無法達成完整複製權限的!

總之,由於 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 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-範例五:
[root@TE02 becky]# ls
123  docY  file1  test1  test.txt  txt
[root@TE02 becky]# rmdir 123
rmdir: 123: Directory not empty
/*
rmdir 123 删除目录命令
[root@TE02 becky]# rm -r 123/*rm -r 123 删除目录命令
rm: descend into directory `123'? y
rm: remove regular file `123/33'? y
rm: remove directory `123'? y
[root@TE02 becky]#rm 333/*rm 333 删除文件命令

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

另外,範例四也是很有趣的例子,我們在之前就談過,檔名最好不要使用 "-" 號開頭, 因為 "-" 後面接的是選項,因此,單純的使用『 rm -aaa- 』系統的指令就會誤判啦! 那如果使用後面會談到的正規表示法時,還是會出問題的!所以,只能用避過首位字元是 "-" 的方法啦! 就是加上本目錄『 ./ 』即可!如果 man rm 的話,其實還有一種方法,那就是『 rm -- -aaa- 』也可以啊!


  • 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 來查閱一下,也是挺有趣的指令喔!


小標題的圖示取得路徑的檔案名稱與目錄名稱

我們前面介紹的完整檔名 (包含目錄名稱與檔案名稱) 當中提到,完整檔名最長可以到達 4096 個字元。 那麼你怎麼知道那個是檔名?那個是目錄名?嘿嘿!就是利用斜線 (/) 來分辨啊! 其實,取得檔名或者是目錄名稱,一般的用途應該是在寫程式的時候,用來判斷之用的啦~ 所以,這部分的指令可以用在第三篇內的 shell scripts 裡頭喔! 底下我們簡單的以幾個範例來談一談 basename 與 dirname 的用途!

[root@www ~]#basename /etc/sysconfig/networknetwork<== 很簡單!就取得最後的檔名~[root@www ~]#dirname /etc/sysconfig/network/etc/sysconfig<== 取得的變成目錄名了!

TAG:

 

评分:0

我来说两句

日历

« 2024-05-18  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 40056
  • 日志数: 47
  • 建立时间: 2010-01-07
  • 更新时间: 2010-10-11

RSS订阅

Open Toolbar