Files

如何使用“mv”強制覆蓋非空目錄

  • October 7, 2019

我想將一組文件/目錄移動(不僅僅是複制)到另一個目錄,其中一些與目標目錄中的文件/目錄有名稱衝突。我的主要目標是移動文件,所以我可以容忍非空目錄被覆蓋。

我目前正在使用mv ... destination,但偶爾會得到

mv: 無法將 `target’ 移動到 /destination/target’: 目錄不為空

我試過mv -f ... destination沒有成功,因為我希望文件從原來的位置消失,rsync這似乎不合適。

作為獎勵,是否有一個很好的解決方案可以通過重命名來保留打算以某種方式覆蓋的文件?

如果您使用mv --backup=numbered

(或--backup開關的其他選項之一),

則將mv完成合併並保留打算被覆蓋的文件。

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
SRC=/path/to/source
DST=/path/to/destination

for item in $SRC/*; do
   if [[ -f "$DST/$(basename "$item")" ]]; then
       newitem=$(basename $item)_old
       while [[ -f "$DST/$newitem" ]]; do
           newitem=${newitem}_old
       done
       mv "$DST/$(basename $item)" "$DST/$newitem"
   fi
   mv "$item" "$DST/$(basename $item)"
done

引用自:https://unix.stackexchange.com/questions/107812