2

2 つのソース フォルダーからすべての一意のファイルを新しい宛先フォルダーにコピーするにはどうすればよいですか?

セット操作として: 2 つのフォルダーの違いを計算するにはどうすればよいですか?

4

4 に答える 4

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
于 2012-03-22T08:54:38.510 に答える
1

(ここで提案されている追加のファイル操作なしで)他の方法があると確信していますが、これを達成するための比較的簡単な方法がここにあります。

前提条件:
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

于 2012-03-21T14:52:53.587 に答える
1

すべてのファイルを から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/は出発点として使用できますが、それで何をしますか?

于 2012-03-21T19:21:52.533 に答える
0

最初は、 を賢く使えば解決できると思ったのですが、実際にrsyncはうまくいきませんでした。

したがって、私の最終的な解決策は小さなPython スクリプト (gist)でした。

于 2012-03-22T11:18:34.093 に答える