2012-03-21 12 views
2

2つのソースフォルダのすべてのユニークなファイルを新しいコピー先フォルダにコピーする方法を教えてください。2つのフォルダを比較し、ユニークなエントリを新しいフォルダにコピー/リンクする

設定操作:どのようにして2つのフォルダの違いを計算できますか?

+0

(1)これは再帰的ですか - ディレクトリツリーを持っていますか、各フォルダの直接の内容を見ていますか? (2)あるソースフォルダに、他のファイルと同じ名前のファイルがありますが、内容は異なりますか?もしそうなら、それらは別個であると考えられているのでしょうか? – ruakh

+0

(1)はい、再帰的です。 (2)私の場合は、内容が変更されるべきではない(新しいファイルが追加される)が、より多くの人々にとってより有用な答えにするために、異なるコンテンツを捕まえると素晴らしいだろう(また、私の仮定は間違っているかもしれない)。 –

+1

'rsync'を試してください.... – lhf

答えて

1

を参照して、明らかに同様のバイナリファイルを比較することができ、最も簡単な方法は、ちょうどその両方をコピーして、一方が他方を上書きできるようにすることです。

cp --recursive foo/ baz/ 
cp --recursive bar/ baz/ 

あなたは少しクリーナーになりたい場合は、とないコピーfoo/に存在するものbar/から、あなたが書くことができます:

cp --recursive foo/ baz/ 
(cd bar/ 
    find -exec bash -c ' if ! [[ -e ../foo/"{}" ]] ; then 
         cp "{}" ../baz/"{}" 
         fi 
        ' \; 
) 

あなたはfoo/には存在しないbar/内のファイルのリストを生成するために同じアプローチを使用することができます。

(cd bar/ 
    find -exec bash -c ' if ! [[ -e ../foo/"{}" ]] ; then 
         echo bar/"{}" 
         fi 
        ' \; 
) 

(またはあなたがゼロ値のバイトを使用するためにprintf %s\0 bar/"{}"echo bar/"{}"を変えることができるが、セパレータとしての改行ではなく)。

また、いくつかのさまざまな、あなたが書くことができる:

diff --old-line-format=%L --new-line-format= --unchanged-line-format= \ 
    <(cd foo/ ; find | sort) <(cd bar/ ; find | sort) 

を入力ファイルとしてdiffcd foo/ ; find | sortcd bar/ ; find | sortの出力を通過して、発見された行を出力するdiffを伝えのみ最初の入力ファイルに保存し、それ以外はすべて破棄します。 (注:ファイル名に改行が含まれていると、これは破損します)。

これらのファイルの内容を比較すると、ファイルの内容が異なっている場合、どうすればよいか分かりません。ファイル内容を調べるにはdiff -r -q foo/ bar/を使用することができますが、これをどうすればいいですか?

1

私は確かに他の方法がありますが(ここに示唆されている余分なファイル操作はありません)、これは比較的簡単な方法です。

前提条件:
A1)フォルダの直接の内容にのみ関心があります。
A2)同じ名前のファイルは、同じ内容のものとみなされます。

1)TMP
からsourceDir2の内容を)
2)
3をtmpにするsourceDir1の内容をコピーし、空の一時ディレクトリ(TMP)を使用して作成/削除 - 今、あなたはsourceDir1のユニークなファイルを持っています
N1)あなたはを使用することができる:TMP
4)
5)繰り返し工程2)-4)sourceDir1とsourceDir2の役割に

ノートスワップ所望の位置にTMPの内容を移動を使用してファイル(またはディレクトリ)を一覧表示し、それをファイル(s1.tmpなど)にリダイレクトします。次に、grepを使用して、現在のファイル(ディレクトリ)がs1.tmpにリストされているかどうかを確認するために、他のフォルダのファイル(ディレクトリ)のリストを比較できます。この技術を使用して、再帰的処理のために入力するディレクトリを計算します(したがって、A1を緩和します)。
N2)問題のファイルがテキストファイルの場合、diffを使用してそれらが同一かどうかを確認できます。そうでなければ、同一のファイル名の大文字、異なる内容を適切に処理する(例えば、ソースを示すためにユニークなエクステンションを使用して両方のファイルを宛先ディレクトリにコピーする - ここでのロジックは目標に依存する)。
N3)あなたはbaz/foo/bar/からすべてのファイルをコピーするにはstackoverflow#4013223superuser#135911

3

あなたはこれを試すことができます:まず

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 
+0

これは"ファイル名は存在しますが、内容が異なる "シナリオにうまくいきます。ファイル名のリストが2つだけではなく、日付スタンプ、ファイルサイズ、ファイル名タプル、md5sumなどの2つのリストを比較することができます。 – tripleee

0

を、私は本当に働いて賢いrsyncの使用が、何もこの問題を解決できると思っていました。

私の最終的な解決策は小さいPython script (gist)でした。

関連する問題