Learning Objectives
- 用 mkdir 建立目錄,用 -p 一次建立多層、用 -v 顯示建立了哪些目錄
- 用 rmdir 移除空目錄,看懂 Directory not empty 錯誤
- 用 cp 複製檔案,用 -r 複製整個目錄
- 用 mv 移動或改名,用 rm 與 rm -r 刪除檔案與目錄,了解刪除不會進資源回收筒
在終端機裡整理檔案
在圖形介面裡,整理檔案是「新增資料夾、拖曳、按右鍵刪除」。在 Linux 的終端機裡,同樣的事情由五個指令完成:
| 動作 | 指令 | 英文由來 |
|---|---|---|
| 建立目錄 | mkdir |
make directory |
| 移除空目錄 | rmdir |
remove directory |
| 複製 | cp |
copy |
| 移動或改名 | mv |
move |
| 刪除 | rm |
remove |
這一課的練習都在 /tmp 底下進行。/tmp 是放暫存檔的目錄,所有使用者都可以寫入,系統重新開機時通常會清空,很適合練習。
投影片的範例以 root 身分執行(提示字元是
root@vm:/tmp#)。Ubuntu 預設用一般使用者登入(提示字元結尾是$), 在/tmp與自己的家目錄裡操作不需要 root;要動系統目錄時才在指令前加sudo(下一課「使用者與權限」說明)。
mkdir 與 rmdir:建立與移除目錄
mkdir [選項] 目錄名稱
| 寫法 | 作用 |
|---|---|
mkdir dir |
建立一個目錄 |
mkdir -p dir1/dir2 |
上層目錄不存在時一併建立;目錄已經存在也不會報錯 |
mkdir -pv dir1/dir2/dir3/dir4 |
-v 列出每一個實際建立的目錄,通常和 -p 一起用 |
mkdir -m 755 example |
建立時直接指定權限(權限數字在下一課說明) |
沒有加 -p 卻要建立 dir1/dir2,而 dir1 還不存在時,會出現 No such file or directory。
rmdir [選項] 目錄名稱
rmdir 只能移除空目錄。目錄裡還有東西時會失敗:
$ rmdir dir1
rmdir: failed to remove 'dir1': Directory not empty
rmdir -p dir1/dir2/dir3/dir4 會從最裡層開始移除,每移除一層就檢查上一層是否也變成空的,空的就一併移除。
cp、mv、rm:複製、移動與刪除
三個指令的寫法都是「指令 選項 來源 目標」:
| 指令 | 常用選項 | 說明 |
|---|---|---|
cp 來源 目標 |
-r 遞迴複製目錄、-i 覆蓋前詢問、-p 保留權限與時間、-a 封存模式(等於 -r 加保留所有屬性) |
目標是一個目錄時,檔案會複製到該目錄底下並沿用原檔名 |
mv 來源 目標 |
-i 覆蓋前詢問、-f 直接覆蓋、-u 來源比較新才覆蓋、-v 顯示過程 |
像「剪下貼上」:來源會消失。目標在同一個目錄裡,就等於改名 |
rm 檔案 |
-i 刪除前詢問、-f 強制刪除不詢問、-r 遞迴刪除整個目錄 |
沒有加 -r 不能刪目錄:rm: cannot remove 'dir': Is a directory |
幾個常見的錯誤訊息:
$ cp test_folder backup
cp: -r not specified; omitting directory 'test_folder'
$ rm test_folder
rm: cannot remove 'test_folder': Is a directory
終端機裡刪除的檔案不會進資源回收筒,
rm -rf會不經詢問刪掉整個目錄樹,按下 Enter 前請再看一次路徑。 投影片的rm -r會逐一詢問,是因為該系統的 root 帳號把rm設成了rm -i的別名;Ubuntu 預設沒有這個別名,rm -r不會詢問。 不確定時,自己加上-i。
來源與目標的寫法
複製與移動時,目標「是不是已經存在的目錄」會決定結果:
| 指令 | backup 不存在時 |
backup 已經是目錄時 |
|---|---|---|
cp -r test_folder backup |
建立 backup,內容和 test_folder 一樣 |
變成 backup/test_folder |
mv a.txt b.txt |
改名為 b.txt |
(b.txt 是目錄時)移進去變成 b.txt/a.txt |
其他常用的寫法:
.代表目前目錄:cp /etc/hosts .把檔案複製到目前所在的目錄..代表上一層目錄:mv notes.txt ..~代表自己的家目錄:cp report.pdf ~/Documents/*是萬用字元:cp *.txt backup/複製目前目錄裡所有.txt檔- 一次處理多個來源時,最後一個參數必須是目錄:
cp a.txt b.txt c.txt backup/
想一想:目錄的建立與移除
目前所在的目錄裡沒有 project,執行 mkdir project/src 會怎樣?
rmdir notes 出現 Directory not empty,代表什麼?
mkdir -pv a/b/c 執行時 a 已經存在,b、c 不存在,輸出會列出哪些目錄?
想一想:複製、移動與刪除
在同一個目錄裡執行 mv draft.txt final.txt,結果是?
cp photos backup 出現 cp: -r not specified; omitting directory 'photos',應該怎麼改?
關於 rm -rf old_project,下列哪一個說法正確?
重點精華回顧
mkdir建立目錄;-p一併建立上層目錄,-v列出實際建立的目錄,-m指定權限。rmdir只能移除空目錄;-p從最裡層往上逐層移除。cp 來源 目標複製檔案;複製目錄要加-r,-a保留所有屬性,-i覆蓋前詢問。mv移動檔案;目標在同一個目錄裡時就是改名。rm刪除檔案,rm -r刪除目錄;終端機裡刪除的檔案不會進資源回收筒,-rf不會詢問,使用前確認路徑。- 目標是已經存在的目錄時,檔案會被放進該目錄;
.、..、~、*可以簡化路徑。