2つのソースフォルダのすべてのユニークなファイルを新しいコピー先フォルダにコピーする方法を教えてください。2つのフォルダを比較し、ユニークなエントリを新しいフォルダにコピー/リンクする
設定操作:どのようにして2つのフォルダの違いを計算できますか?
2つのソースフォルダのすべてのユニークなファイルを新しいコピー先フォルダにコピーする方法を教えてください。2つのフォルダを比較し、ユニークなエントリを新しいフォルダにコピー/リンクする
設定操作:どのようにして2つのフォルダの違いを計算できますか?
を参照して、明らかに同様のバイナリファイルを比較することができ、最も簡単な方法は、ちょうどその両方をコピーして、一方が他方を上書きできるようにすることです。
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)
を入力ファイルとしてdiff
にcd foo/ ; find | sort
とcd bar/ ; find | sort
の出力を通過して、発見された行を出力するdiff
を伝えのみ最初の入力ファイルに保存し、それ以外はすべて破棄します。 (注:ファイル名に改行が含まれていると、これは破損します)。
これらのファイルの内容を比較すると、ファイルの内容が異なっている場合、どうすればよいか分かりません。ファイル内容を調べるにはdiff -r -q foo/ bar/
を使用することができますが、これをどうすればいいですか?
私は確かに他の方法がありますが(ここに示唆されている余分なファイル操作はありません)、これは比較的簡単な方法です。
前提条件:
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#4013223とsuperuser#135911
あなたはこれを試すことができます:まず
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
これは"ファイル名は存在しますが、内容が異なる "シナリオにうまくいきます。ファイル名のリストが2つだけではなく、日付スタンプ、ファイルサイズ、ファイル名タプル、md5sumなどの2つのリストを比較することができます。 – tripleee
を、私は本当に働いて賢いrsync
の使用が、何もこの問題を解決できると思っていました。
私の最終的な解決策は小さいPython script (gist)でした。
(1)これは再帰的ですか - ディレクトリツリーを持っていますか、各フォルダの直接の内容を見ていますか? (2)あるソースフォルダに、他のファイルと同じ名前のファイルがありますが、内容は異なりますか?もしそうなら、それらは別個であると考えられているのでしょうか? – ruakh
(1)はい、再帰的です。 (2)私の場合は、内容が変更されるべきではない(新しいファイルが追加される)が、より多くの人々にとってより有用な答えにするために、異なるコンテンツを捕まえると素晴らしいだろう(また、私の仮定は間違っているかもしれない)。 –
'rsync'を試してください.... – lhf