同じ名前の2つのディレクトリがあります。
$ ls mydir
file1 file2
$ ls other/mydir
file3 file4
mydir
にコピーすると、other
2つmydir
がマージされます。
$ cp -r mydir other
$ ls other/mydir
file1 file2 file3 file4
マニュアル(または情報)ページのどこにcp
これが基本的に行われているのですか?
を使用しても同じことが起こりますcp -rn mydir other
。
cp
私は2つをマージするかどうか尋ねる質問をすることを好みます。mydir
これにより、コピーしmydir
たother
後に他のアイテム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 "$@"
}