差分結果ファイルのコピー

差分結果ファイルのコピー

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

diff コマンドを使用して両方のフォルダのファイルを比較しました。特定のファイルはフォルダ A にのみ存在し、特定のファイルはフォルダ B にのみ存在することが判明したので、両方のフォルダからそれらの特徴的なファイルをフォルダ C という 1 つのフォルダにコピーします。このフォルダには、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 内のファイル名をそれぞれ含む配列 (Aおよび) が作成されます。B

実行ステップでは、すべて のプレフィックスが付いた配列cpの拡張から配列をA除いたもの、および、すべて のプレフィックスが付いた配列の対応する拡張から配列を除いたものを にコピーするように要求します。BfolderABAfolderBfolderC

答え2

diffsedおよびを使用したハッキーなソリューション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'

関連情報