2019年4月20日 星期六

mv: Directory not empty

mv 是 linux 移動檔案或是目錄的一個工具程式, 但是在某個情境下, mv 會無法完成這件事情, 並發出以下訊息。

command unable to remove target: Directory not empty

fig 1 /tmp/o1, /tmp/b1 的目錄內容
當 o1/1 目錄有個檔案時, 以下指令就會失敗, 就算 o1/1/15 和 b1/1/ 目錄裡頭的檔案並沒有檔名重複。

descent@debian64:o1$ mv 1 /tmp/b1/
mv: cannot move ‘1’ to ‘/tmp/b1/1’: Directory not empty

ref:
  1. mv: Directory not empty
  2. mv: 无法将'.idea/' 移动至'~/.trash/.idea': Directory not empty
  3. 【Linux】mv命令全解析 原
ref 3 說明了檔案覆蓋情形, 那麼目錄呢?
ref 2 提供了 -b 參數, 但這可能不是我們要的。

list 1 info mv
Make a backup of each file that would otherwise be overwritten or
     removed.  Without this option, the original versions are destroyed.
     Use METHOD to determine the type of backups to make.  When this
     option is used but METHOD is not specified, then the value of the
     ‘VERSION_CONTROL’ environment variable is used.  And if
     ‘VERSION_CONTROL’ is not set, the default backup type is
     ‘existing’.

     ‘none’
     ‘off’
          Never make backups.

     ‘numbered’
     ‘t’
          Always make numbered backups.

     ‘existing’
     ‘nil’
          Make numbered backups of files that already have them, simple
          backups of the others.

     ‘simple’
     ‘never’
          Always make simple backups.  Please note ‘never’ is not to be
          confused with ‘none’.

list 1 是 info mv 的部份內容, mv --backup[=CONTROL] 的 CONTROL 就是 list 1 那些值。

descent@debian64:o1$ mv 1 /tmp/b1/

通常我們想要的結果是希望 /tmp/o1/1/15 被移動到 /tmp/b1/1/, 但是 list 1 的那些 option 都做不到這個效果, -b 會把 /tmp/b1/1/ 改成 tmp/b1/1~/, 然後吧 o1/1 移動到 /tmp/b1/, -b 相當於 mv --backup=simple 1 /tmp/b1/。

descent@debian64:o1$ ls /tmp/b1/
0  1  1~  2  2.txt  3

這不是我們要的結果, 似乎只能改用 cp or rsync or tar 來完成這個效果, 再把原來的目錄刪除。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。