cpが同じ名前の2つのディレクトリをマージするのを防ぐ方法は?

cpが同じ名前の2つのディレクトリをマージするのを防ぐ方法は?

同じ名前の2つのディレクトリがあります。

$ ls mydir
file1 file2

$ ls other/mydir
file3 file4

mydirにコピーすると、other2つmydirがマージされます。

$ cp -r mydir other

$ ls other/mydir
file1 file2 file3 file4

マニュアル(または情報)ページのどこにcpこれが基本的に行われているのですか?

を使用しても同じことが起こりますcp -rn mydir other

cp私は2つをマージするかどうか尋ねる質問をすることを好みます。mydirこれにより、コピーしmydirother後に他のアイテムmydirがすでに存在することを忘れた場合は、other作業を中止できます。可能ですか?

ベストアンサー1

GNU coreutils のマニュアルではこれを見ることができません。次のように指定されます。POSIX:

2. もしソースファイルディレクトリタイプの場合は、次の手順を実行する必要があります。

[せん断ターゲットファイルが既存のディレクトリの場合は再帰モードには適用されません。

    F.ディレクトリ内のファイルソースファイルこのディレクトリにコピーする必要があります宛先ファイル[… ]

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 "$@"
}

おすすめ記事