2つのソースディレクトリツリーのうち、変更されたファイルのみを含むディレクトリツリーを作成する方法

2つのソースディレクトリツリーのうち、変更されたファイルのみを含むディレクトリツリーを作成する方法

同様のファイルを含む2つのディレクトリツリー(実際にはmacOSボリューム)があり、2つのソースツリー間で変更されたファイルのみを含む3番目のディレクトリツリーを作成しようとしています。

どうすればいいですかrsync?それともこれを達成するために別のツールを使用する必要がありますか?

答え1

  • 使用同期(目安としてこの回答):
    SOURCE_TREE_1="/some/where/tree_1"
    SOURCE_TREE_2="/some/where/tree_2"
    DIFF_DIR="/some/where/diff"
    
    rsync --dry-run \
          --recursive \
          --checksum \
          --itemize-changes \
          "$SOURCE_TREE_1/" "$SOURCE_TREE_2" | # trailing '/' in source directory is necessary!
      grep -E '^>fc' | # grep files with different checksums
      cut -d ' ' -f 2- |
    while read file; do
      subdir="${file%/*}";
      [ "$file" != "$subdir" ] && mkdir -p "$DIFF_DIR/$subdir";
    
      # Change `"$SOURCE_TREE_1/$file"` to `"$SOURCE_TREE_1/$file"` in the next
      # line if you want copy from source tree #2.
      cp -a "$SOURCE_TREE_1/$file" "$DIFF_DIR/$file";
    done
    
  • 使用:
    cd "$SOURCE_TREE_1"
    git init .
    git add .
    git commit -m 'Init' # Note: Here git may ask you to set name and email
    
    # replace all files with files from source tree #2
    rm -rf $(git ls-tree --name-only HEAD)
    rsync --archive "$SOURCE_TREE_2/" .
    
    # show changes briefly:
    git status -uno
    # show changes for some file:
    git diff "path/to/file"
    
    # restore source tree #1 state
    git restore .
    

関連情報