最近測試某流程時,跑的過程報錯了,於是檢查腳本修改后重新測試。腳本是改過來了,但在shell
中運行某步時碰到了如題報錯!
$ mv MP_genus_network_files/ tax_network
mv: cannot move `MP_genus_network_files/' to `tax_network/MP_genus_network_files': Directory not empty
這個錯誤是這樣的:mv
命令移動的東西如果在目標路徑中已存在(不為空),那么它是移動不了的,這是mv
的一種保護機制,防止錯誤覆蓋。
但是這一點發生在流程中就不友好了。由於各種各樣的原因,分析人員運行到中間步驟很可能報錯,但過程文件已經生成了,如果修改腳本后再次運行的話就覆蓋不了,導致流程又一次強制報錯退出,這可不是我們想要的。怎么在自動化流程中設置這個因素呢?條件判斷的話又長又臭,而且那么多文件目錄沒法一一判斷。這里最好用rsync
來代替mv
命令。
rsync -a MP_genus_network_files/ tax_network/MP_genus_network_files
注意要將該目錄文件作為目標目錄的子目錄的話,目標目錄也要加上子目錄的名稱,否則加入的只是子目錄中包含的文件。
復制后不忘了刪除原目錄文件:
rm -rf MP_genus_network_files/
很顯然,這里用cp -r
也一樣實現,那么用rsync
和cp
備份文件到底有什么區別呢?因為這不是本篇重點,只是簡單列出:
rsync
相當於從源到目的拷貝文件,而且可以設置參數,保持很多文件和文件夾的屬性。對於拷貝文件實現備份,rsync
總體而言比cp
要好,因為rsync
只拷貝那些改動了的內容。但這也不是絕對的,比如cp -u
也可以實現同樣的效果。
Ref: https://askubuntu.com/questions/269775/mv-directory-not-empty
Ref:https://www.crifan.com/linux_command_rsync_vs_cp/