2025 Mar. 20.
#!/bin/bash
# コマンドの引数を取得
SRC_DIR="${1%/}"
DEST_DIR="${2%/}"
# 引数のチェック
if [ -z "$SRC_DIR" ] || [ -z "$DEST_DIR" ]; then
echo "Usage: $0 <source_directory> <destination_directory>" >&2
exit 1
fi
# 指定されたディレクトリが存在するかチェック
if [ ! -d "$SRC_DIR" ] || [ ! -d "$DEST_DIR" ]; then
echo "Error: One or both specified directories do not exist." >&2
exit 1
fi
# SRC_DIR内のすべてのファイルを走査
while read -r src_file; do
# 置換後のファイルパスを生成
dest_file="${src_file/$SRC_DIR/$DEST_DIR}"
if [ ! -e "$dest_file" ]; then
# 置換後のファイルが存在しない場合、コピー
mkdir -p "$(dirname "$dest_file")"
cp -a "$src_file" "$dest_file"
else
# 置換後のファイルが存在する場合、バイナリ比較
if ! cmp -s "$src_file" "$dest_file"; then
cp -a "$src_file" "$dest_file"
fi
fi
done < <(find "${SRC_DIR}/" -type f)