はい

はい

はい

a/2つのディレクトリがあり、ここにb/次のファイルが含まれているとします。

a/
a/foo/1
a/bar/2
a/baz/3

b/
b/foo/1
b/bar/2

作成とa/foo/1同じb/foo/1ですがa/bar/2異なりますb/bar/2

a/にマージした後、以下b/を取得したいと思います。

a/
a/bar/2

b/
b/foo/1
b/bar/2
b/baz/3

説明する

  • a/foo/は(再帰的に)と同じなのでb/foo/削除しますa/foo/
  • a/bar/2だからb/bar/2私たちは何もしません。
  • a/baz/にのみ存在し、a/には存在しないのでb/に移動しますb/baz/

既製のシェルコマンドはありますか?効果があるような感じはしますがrsyncよくわかりませんrsync

答え1

これを行う特定のコマンドを知っているとは言えません。ただし、ハッシュのみを使用してこれを行うことができます。

簡単な例は次のとおりです。

#!/bin/bash

# ...some stuff to get the files...

# Get hashes for all source paths
for srcFile in "${srcFileList[@]}"
do
  srcHashList+="$(md5sum "$srcFile")"
done

# Get hashes for all destination paths
for dstFile in "${dstFileList[@]}"
do
  dstHashList+="$(md5sum "$dstFile")"
done

# Compare hashes, exclude identical files, regardless of their path.
for srci in "${!srcHashList[@]}"
do
  for dsti in "${!dstHashList[@]}"
  do
    match=0
    if [ "${srcHashList[$srci]}" == "${dstHashList[$dsti]}" ]
    then
      match=1
    fi
    if [ $match != 1 ]
    then
      newSrcList+=${srcFileList[$srci]}
      newDstList+=${dstFileList[$dsti]}
    fi
  done
done
# ...move files after based on the new lists

特に、互いに同じパスを持つファイルにのみ興味がある場合は、よりきれいにすることができます。線形時間で行うことも可能ですが、全体的な概念は実行可能です。

関連情報