フォルダー 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
除いたもの、および、すべて のプレフィックスが付いた配列の対応する拡張から配列を除いたものを にコピーするように要求します。B
folderA
B
A
folderB
folderC
答え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'