違い結果ファイルのコピー

違い結果ファイルのコピー

フォルダAとフォルダBという2つのフォルダがあります。

diffコマンドを使用して、2つのフォルダのファイルを比較しました。これで、一部のファイルはフォルダAでのみ利用可能で、一部のファイルはフォルダBでのみ利用可能であることを確認した後、これらの一意のファイルを両方のフォルダからフォルダCフォルダという名前のフォルダにコピーしようとしています。 AとB

どうすればいいですか?

答え1

使用できるzshの配列減算と中括弧拡張機能、このように:

設定:

$ tree .
.
├── folderA
│   ├── file0
│   ├── file1
│   └── file2
├── folderB
│   ├── file2
│   ├── file3
│   └── file4
└── folderC

3 directories, 6 files


cd folderA
A=(*)
cd ../folderB
B=(*)
cd ..

実装する:

cp folderA/${^A:|B} folderB/${^B:|A} folderC

結果:

$ tree folderC
folderC
├── file0
├── file1
├── file3
└── file4

0 directories, 4 files

これら2つの設定手順では、それぞれフォルダAとBにファイル名を含む配列(および名前)を作成しますAB

実行フェーズでは、配列からcp配列の拡張(すべてプレフィックスが付く)と配列から配列を引いた拡張(すべてプレフィックスが付く)をにコピーする必要があります。ABfolderABAfolderBfolderC

答え2

diff、および以下を使用するsedハッキーソリューションxargs

テスト設定:

$ mkdir folderA folderB folderC
$ touch folderA/fi\ le1 folderA/file2 folderA/file3 folderB/file3 folderB/file4
$ diff -rq folderA folderB
Only in folderA: fi le1
Only in folderA: file2
Only in folderB: file4

sedこれで、文字列で始まるすべての行をフィルタリングOnly in folderA:し、この部分をfolderA/引用符()を含む相対ファイル名に変更するために使用します'folderA/fi le1'。その後、この文字列はパイプで接続され、xargsファイルをfolderC

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderA\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderA/fi le1' -> 'folderC/fi le1'
'folderA/file2' -> 'folderC/file2'

同じ上記とfolderB

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderB\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderB/file4' -> 'folderC/file4'

関連情報