iT邦幫忙

2025 iThome 鐵人賽

DAY 14
2

嗨!歡迎回到上班族的命令列生存手冊,上一個章節談到怎麼複製東西,這個章節來講怎麼移動檔案,還會說明怎麼「重新命名」。買一送一!準備好了嗎?讓我們開始吧!

移動檔案

就是 mv 指令!簡單的來說就是 $ mv <路徑> <其他路徑> 。舉個例子,我的目錄下有一個 hello.txt ,目標是將他移動到「上一層」資料夾,裡頭有一個 reallyCool 資料夾。

移動的方式是:

$ mv hello.txt ../reallyCool/

別忘了,mv 後面的指定檔案的位置,本質都是路徑,在打路徑時用 tab 鍵自動補全,也可以少打一些字。cp 指令也可以這樣做,因為也是路徑。
mv 也可以把一個檔案,移動到同一個地方,只是換個名稱…。 等一下,這個不就是「重新命名」嗎?
沒錯,重新命名就是這樣下的。

$ mv hello.txt world.txt

這樣子下,hello.txt 就會被重新命名成 world.txt 了,是不是很簡單粗暴呢?
另外一點,如果檔案移動的目的地有一個名子相同的檔案,就會被直接覆蓋過去,簡直是很黃、很暴力。怎麼樣讓他不要這麼粗魯呢?

cp 一樣,可以善用 -i 進入互動模式(interactive mode)!

$ mv -i hello.txt world.txt

或是直接遇到一樣的檔案,就不要覆蓋,請用 -n ;或是今天很嗆,霸道總裁直接覆蓋,請加上 -f

遇到類似的檔名

mv 的用法有些和 cp 很類似,例如在上一章提到如果有類似的名子,可以用 * 號來做模糊選取類似的檔案。比如說有 xaaxabxac 三個檔案,用以下方式可以一次移動這三個檔案到其他資料夾:

$ mv xa* ../otherFolder

一堆互斥的指令

如果真的吃錯藥輸入了互斥的命令,會發生什麼是?像是下了「就不要覆蓋」,又下了「直接給我覆蓋」,這種奇形怪狀的指令?

$ mv -n -f hello.txt world.txt

簡單!永遠都是後面那一個指令會被執行,所以上面的那個會是進行:直接給我覆蓋。

有趣的發現

前幾章節,揭露網路寫手怎麼寫 Linux 指令教學文章,介紹過 man 指令,這個指令是指令的說明書。裡面就有介紹一些很有趣的使用方法,像是這些:

如果有覆蓋,請建立一個備份

就是 -b

$ mv -b hello.txt somewhere/

移動過去的資料夾,已經有同名的檔案了,怎麼辦?用這個指令,會吧本來要被蓋過去的檔案,重新命名成「檔案~」。一樣用上面的 hello.txt 作為範例,如果目的地也有 hello.txt,則目的地原本的 hello.txt 會變成 hello.txt~ 做了一個備份。

交換兩個檔案

--exchange

沒想到這個指令也能兩兩交換對吧?我也是看 man 才知道的!假設目錄下有兩個檔案,分別是:hello.txtworld.txt。加上 --exchange 可以讓他們兩兩交換。

$ mv --exchange hello.txt world.txt

不覺得 mv 也太快了嗎?

上一個章節介紹 inode 時提到,目錄本身也是一個特殊的檔案,紀錄「檔案名稱」-> inode 的表格,也知道這個住戶資料是跟著某一個分割區的檔案系統的。

在同一個分割區移動檔案,根本不需要移動真正的檔案!只需要調整兩個目錄對應的表格內容即可,也就是說從目標檔案起始地的表格剪下:檔案名稱 -> inode 對應資訊,在目的地目錄的對應表之中貼上即可。

介紹了「複製」與「移動」檔案後,還有一個東西也需要題就是如何「創建」檔案,不過夜已經深了(以筆者寫的時間為準)就留到下回分解囉,下次見。


上一篇
Day13 基礎操作篇:怎麼複製檔案? 以及目錄的本質
下一篇
Day15 基礎操作篇:你說要有東西,就有東西 touch
系列文
上班族的命令列 (CLI) 生存手冊15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
chiaominchang222
iT邦新手 5 級 ‧ 2025-09-28 12:42:46

interactive起來

1
AndyAWD
iT邦新手 2 級 ‧ 2025-09-28 21:46:18

原來是翻開覆蓋的指令啊

我要留言

立即登入留言