Cp
如何防止cp合併兩個同名目錄?
我有兩個同名的目錄:
$ ls mydir file1 file2 $ ls other/mydir file3 file4
如果我複製
mydir
到other
,則兩個mydir
s 將合併:$ cp -r mydir other $ ls other/mydir file1 file2 file3 file4
它在手冊(或資訊)頁面中的
cp
哪個位置說預設情況下會這樣做?如果我使用
cp -rn mydir other
.如果
cp
問我是否要合併兩個mydir
s,我會更喜歡它;因此,如果我複製mydir
到other
而忘記已經有一個不同mydir
的 inother
,我可以中止操作。這可能嗎?
我沒有在 GNU coreutils 的手冊中看到這一點。它由POSIX指定:
2、如果source_file是directory類型,則需要執行以下步驟:
[當目標文件是現有目錄時,不適用於遞歸模式的剪輯步驟]
F。目錄source_file中的文件應複製到目錄dest_file
$$ … $$
cp -rn
沒有幫助,因為該-n
選項只說“不要覆蓋”,但合併目錄不會覆蓋任何東西。我沒有看到任何選項
rsync
或pax
對您有幫助。您可以使用
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 "$@" }