rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

あるディレクトリの内容を別のディレクトリに、ファイルを完全比較しつつコピーするbashスクリプト

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)