2 つのソース フォルダーからすべての一意のファイルを新しい宛先フォルダーにコピーするにはどうすればよいですか?
セット操作として: 2 つのフォルダーの違いを計算するにはどうすればよいですか?
2 つのソース フォルダーからすべての一意のファイルを新しい宛先フォルダーにコピーするにはどうすればよいですか?
セット操作として: 2 つのフォルダーの違いを計算するにはどうすればよいですか?
これを試すことができます:
cd <First Dir>
find . > /tmp/first.dat
cd <Second Dir>
find . > /tmp/second.dat
comm -23 /tmp/first.dat /tmp/second.dat | while read line; do cp <First Dir>/$line <New Dir> ; done
comm -13 /tmp/first.dat /tmp/second.dat | while read line; do cp <SecondDir>/$line <New Dir> ; done
(ここで提案されている追加のファイル操作なしで)他の方法があると確信していますが、これを達成するための比較的簡単な方法がここにあります。
前提条件:
A1)フォルダの直接の内容にのみ関心があります。
A2)同じ名前のファイルは、同じ内容であると見なされます。
1)空の一時ディレクトリ(tmp)を作成/使用します
2)sourceDir1の内容をtmpにコピーします
3)tmpからsourceDir2の内容を削除し
ます-これで、tmpにsourceDir1の一意のファイルがあります
4)tmpの内容をに移動します目的の場所
5)sourceDir1とsourceDir2の役割を入れ替えて手順2)〜4)を繰り返します
注:
N1)を使用ls
して、ファイル(またはディレクトリ)を一覧表示し、ファイル(s1.tmpなど)にリダイレクトできます。次に、を使用して他のフォルダのファイル(ディレクトリ)のリストを比較しgrep
、現在のファイル(ディレクトリ)がs1.tmpにリストされているかどうかを確認できます。この手法を使用して、再帰処理のために入力するディレクトリを計算できます(したがって、A1を緩和します)。
N2)問題のファイルがテキストファイルの場合、diffを使用してそれらが同一であるかどうかを確認できます。はいの場合は前と同じように進み、そうでない場合は同じファイル名、異なるコンテンツの場合を適切に処理します(たとえば、一意の拡張子を使用して両方のファイルを宛先ディレクトリにコピーし、ソースを示します。ここでのロジックは目標によって異なります)。
N3)バイナリファイルも明らかに比較できます。を参照してください。stackoverflow#4013223およびsuperuser#135911
すべてのファイルを からfoo/
およびbar/
にbaz/
コピーするには、両方をコピーし、一方を他方に上書きさせるのが最も簡単な方法です。
cp --recursive foo/ baz/
cp --recursive bar/ baz/
に存在するものからコピーしたくない場合は、次のように記述できます。bar/
foo/
cp --recursive foo/ baz/
( cd bar/
find -exec bash -c ' if ! [[ -e ../foo/"{}" ]] ; then
cp "{}" ../baz/"{}"
fi
' \;
)
bar/
同じアプローチを使用して、に存在しないのファイルのリストを生成できますfoo/
。
( cd bar/
find -exec bash -c ' if ! [[ -e ../foo/"{}" ]] ; then
echo bar/"{}"
fi
' \;
)
(または、区切り文字として改行ではなくゼロ値のバイトを使用するように変更echo bar/"{}"
することもできます)。printf %s\0 bar/"{}"
あるいは、いくつかの種類については、次のように書くこともできます:
diff --old-line-format=%L --new-line-format= --unchanged-line-format= \
<( cd foo/ ; find | sort ) <( cd bar/ ; find | sort )
cd foo/ ; find | sort
との出力cd bar/ ; find | sort
を入力ファイルとして渡し、最初の入力ファイルでのみ見つかった行を出力し、それ以外はすべて破棄するようにdiff
指示します。(注:ファイル名に改行が含まれていると、これは壊れます。)diff
上記のいずれも、異なるファイルの内容を比較していません。単に、ファイルが異なる場合に何をすべきかがわからないためです。ファイルの内容を調べることdiff -r -q foo/ bar/
は出発点として使用できますが、それで何をしますか?
最初は、 を賢く使えば解決できると思ったのですが、実際にrsync
はうまくいきませんでした。
したがって、私の最終的な解決策は小さなPython スクリプト (gist)でした。