Cp

如何防止cp合併兩個同名目錄?

  • December 21, 2015

我有兩個同名的目錄:

$ ls mydir
file1 file2

$ ls other/mydir
file3 file4

如果我複製mydirother,則兩個mydirs 將合併:

$ cp -r mydir other

$ ls other/mydir
file1 file2 file3 file4

它在手冊(或資訊)頁面中的cp哪個位置說預設情況下會這樣做?

如果我使用cp -rn mydir other.

如果cp問我是否要合併兩個mydirs,我會更喜歡它;因此,如果我複製mydirother而忘記已經有一個不同mydir的 in other,我可以中止操作。這可能嗎?

我沒有在 GNU coreutils 的手冊中看到這一點。它由POSIX指定:

2、如果source_file是directory類型,則需要執行以下步驟:

[當目標文件是現有目錄時,不適用於遞歸模式的剪輯步驟]

    F。目錄source_file中的文件應複製到目錄dest_file

$$ … $$

cp -rn沒有幫助,因為該-n選項只說“不要覆蓋”,但合併目錄不會覆蓋任何東西。

我沒有看到任何選項rsyncpax對您有幫助。

您可以使用cp. 不過,解析命令行選項很繁瑣。未經測試的程式碼。已知問題:這不支持縮寫的長選項。

function cp {
 typeset source target=
 typeset -a args sources
 args=("$@") sources=()
 while [[ $# -ne 0 ]]; do
   case "$1" in
     --target|-t) target=$2; shift args;;
     --target=*) target=${1#*=};;
     -t?*) target=${1#??};;
     --no-preserve|--suffix|-S) shift;;
     --) break;;
     -|[^-]*) if [ -n "$POSIXLY_CORRECT" ]; then break; else sources+=($1); fi;;
   esac
   shift
 done
 sources+=("$@")
 if [[ -z $target && ${#sources[@]} -ne 0 ]]; then
   target=${sources[-1]}
   unset sources[-1]
 fi
 for source in "${sources[@]}"; do
   source=${source%"${source##*[^/]}"}
   if [ -e "$target/${source##*/}" ]; then
     echo >&2 "Refusing to copy $source to $target/${source##*/} because the target already exists"
     return 1
   fi
 done
 command cp "$@"
}

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