フォルダ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にファイル名を含む配列(および名前)を作成します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'