Linux下mv命令高階用法

良許Linux發表於2019-05-08

mv 也是 Linux 下一個使用頻率非常高的命令,但除了一些基本用法,你還知道它的哪些高階用法呢?

1. 基本用法

  1. 移動一個/多個檔案;

  2. 移動一個/多個目錄;

  3. 重新命名檔案/目錄。

這些都是很基本的用法,無需贅述。下面介紹一些更高階的用法。

2. 列印操作資訊

我們如果只移動一兩個或少數幾個檔案/目錄時,暫且還可以去目標位置去檢視檔案是否移動成功。但如果有千百個檔案呢?如何在不去目標位置檢視的情況下知道我們的操作是否已經成功了呢?我們可以加上 -v 選項。

[alvin@VM_0_16_centos mv_test]$ mv -v *.txt /home/alvin/test/mv_test/des/
‘file1.txt’ -> ‘/home/alvin/test/mv_test/des/file1.txt’
‘file2.txt’ -> ‘/home/alvin/test/mv_test/des/file2.txt’
‘file3.txt’ -> ‘/home/alvin/test/mv_test/des/file3.txt’
‘file4.txt’ -> ‘/home/alvin/test/mv_test/des/file4.txt’
‘file5.txt’ -> ‘/home/alvin/test/mv_test/des/file5.txt’複製程式碼

當然,此方法同樣適用於移動目錄。

3. 使用互動模式

在預設情況下,我們移動檔案/目錄時,不會有任何提示。如果在目標位置我們有個相同名字的檔案/目錄,mv 命令也不會提示而直接替換原來的檔案。而這樣的操作,有時可能會造成災難性的後果。

在這種情況下,我們可以加一個 -i 選項,當目標位置有相同名字的檔案時,它將會進行提示。如果你確認要覆蓋目標檔案,鍵入 y 即可。

[alvin@VM_0_16_centos mv_test]$ mv -i file1.txt /home/alvin/test/mv_test/des/
mv: overwrite ‘/home/alvin/test/mv_test/des/file1.txt’? y複製程式碼

4. 不覆蓋同名檔案

如果目標位置有同名檔案,我們不希望它被覆蓋,可以加上 -n 選項。

[alvin@VM_0_16_centos mv_test]$ ll *.txt des/*.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:26 file2.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:35 file3.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:26 des/file1.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:27 des/file2.txt
[alvin@VM_0_16_centos mv_test]$ mv -nv *.txt /home/alvin/test/mv_test/des/
‘file3.txt’ -> ‘/home/alvin/test/mv_test/des/file3.txt’ #目標位置沒有file3.txt檔案,所以成功移動
[alvin@VM_0_16_centos mv_test]$ ls
des  file2.txt複製程式碼

5. 使用更新選項

當目標位置有同名檔案/目錄時,我們只希望原始檔比目標檔案時間戳更新時,才進行覆蓋,否則不執行。這種情況下,我們可以使用 -u 選項。

[alvin@VM_0_16_centos mv_test]$ ll *.txt des/*.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:26 file1.txt   #原始檔比目標檔案時間戳更新
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:26 file2.txt   #原始檔比目標檔案時間戳更舊
-rw-rw-r-- 1 alvin alvin 0 Feb  8 16:53 des/file1.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:27 des/file2.txt
[alvin@VM_0_16_centos mv_test]$ mv -uv *.txt /home/alvin/test/mv_test/des/
‘file1.txt’ -> ‘/home/alvin/test/mv_test/des/file1.txt’ #只有時間戳更新的檔案被替換
[alvin@VM_0_16_centos mv_test]$ ls
des  file2.txt複製程式碼

6. 覆蓋前建立備份

目標位置已經有了同名檔案,如果直接覆蓋總覺得有點不踏實,萬一現在的決定是錯的呢?有沒可能在覆蓋之前,先將目標檔案進行備份?答案是肯定的,加一個 -b 選項即可。

[alvin@VM_0_16_centos mv_test]$ mv -bv *.txt /home/alvin/test/mv_test/des/
‘file1.txt’ -> ‘/home/alvin/test/mv_test/des/file1.txt’ (backup: ‘/home/alvin/test/mv_test/des/file1.txt~’)
‘file2.txt’ -> ‘/home/alvin/test/mv_test/des/file2.txt’ (backup: ‘/home/alvin/test/mv_test/des/file2.txt~’)
[alvin@VM_0_16_centos mv_test]$ ll des/
total 0
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:41 file1.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:26 file1.txt~
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:26 file2.txt
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:27 file2.txt~
-rw-rw-r-- 1 alvin alvin 0 Feb  8 17:35 file3.txt複製程式碼

可以看到,在覆蓋之前,會將目標檔案備份為一個帶波浪號 ~ 的檔案,同時細心的讀者也會注意到,覆蓋後檔案與備份檔案的時間戳不一樣。

以上就是 mv 命令的一些更高階用法,靈活使用的話會為自己的工作效率提高一個檔次,在同事面前也更能裝逼。


我是良許,世界500強外企 Linux 開發工程師,專業生產 Linux 乾貨。歡迎關注我的公眾號「良許Linux」,回覆「1024」獲取最新最全的技術資料,回覆「入群」進入高手如雲技術交流群。

img


相關文章