Linux

如何執行相當於 yes | 的 mvcp -rf 在目錄上?

  • July 22, 2017

以下面的目錄樹為例,將內容移動directory/folderAdirectory.

如果目標中存在同名文件,如何覆蓋文件,例如:directory/folderA/2017/06/info.logdirectory/2017/06/info.log.

directory
|-- folderA
|   |-- 2017
|   |   |-- 06
|   |
|   |-- 2016
|   |   |-- 12
|   |   |-- 11
|   |   |-- 10
|
|-- 2017
|   |-- 04
|   |-- 05
|   |-- 06
|
|-- 2016
|   |

cp -l您可以使用( --link,硬連結文件而不是複制)來實現這一點:

cp -rfl folderA .
rm -rf folderA

mv只是移動即重命名目錄為您的directory. 對於在同一文件系統中移動文件mv使用rename()系統呼叫。如果源和目標位於不同的文件系統上,mv將使用cprm完成移動,但仍首先刪除目標,複製硬連結文件 ( -R) 但不遵循符號連結 ( -P):

rm -f destination_path && \
cp -pRP source_file destination && \
rm -rf source_file

雖然您無法更改 的這種行為mv,但該cp命令本身更加靈活,您確實應該使用它。使用cp,-f導致在目標內部刪除和創建單個文件,而不是首先刪除整個目標。

也受到限制,cp因為它只能覆蓋 ( -f)、保存器 ( -n) 或詢問 ( -i)。如果您需要在決定保留哪個文件之前比較文件,則需要rsync.

如果您仍然需要使用rename()系統呼叫但要實現根據需要合併目錄的目標,則需要編寫一個腳本來rename()為單個文件呼叫單個 s。

引用自:https://serverfault.com/questions/862280