2つのテキストファイルの違いに基づいてファイルを削除する

2つのテキストファイルの違いに基づいてファイルを削除する

以下のように2つの.txtファイルを作成しました。

5fba026dcf271c6fa174b9fc2fc1fefadf1370f9 ./.changeFiles/change/addImage1.change  
bb352fba5807f4d03ea11abb00e411b00ce38673  ./.changeFiles/change/addImage2.change  
999eea42e4e72431695815456a3ac16796df5eed  ./.changeFiles/change/addSurface1.change

1 つは特定のディレクトリで .change または .tstwf で終わるすべてのファイルのリストで、もう 1 つは shasum に基づいて重複エントリが削除されたリストのソートされたバージョンです。

両方のファイルに colordiff -u を使用すると、削除したいファイルに対するすべての変更が適用されます。削除するファイルが何百ものあるため、手動で削除したくありません...

私の質問は:sorted.txtに含まれていないファイルをディレクトリから削除してdiffに表示するにはどうすればよいですか?

編集1:

Workflows.txt (ソースファイル):

23ded53098d5d233c0a54af482542ba7a42860d3  ./encryption/AFPtoPDFwEncryption.tstwf
24a37e00de73a58736be1aee56d4b073e75a994f  ./workflows-from-will/workflow/AFPtoPDF.tstwf
2532934d268bb6eddc6a018e3469b0a53a794e10  ./workflows-from-will/workflow/change/table.without.emptycells.rotation.270.mark-content.change
264a08fef59d9b9c18a857e2532f0b7b5a92c60b  ./pageModification/AFPtoPDFwFillRectMod1.tstwf
2680a37bb22512bf3119e3991bb2c814cb23fb77  ./workflows-from-will/workflow/AFPtoPDFwHyperlinks.tstwf
268635261e91a4caf1a09979ffdb8163d4d22c8a  ./AFPmicr.tstwf
268635261e91a4caf1a09979ffdb8163d4d22c8a  ./workflows-from-will/eds-0923/AFPmicr.tstwf

Workflows-sorted.txt (保存するすべてのファイルのリスト):

0bdbcbed279e2df9149de319253609f11b19d689  ./textModification/AFPtoPDFwReplaceTextMod2.tstwf
0d0ebfb8d519ff84e3dd86771d067bdeea835df6  ./pageModification/AFPtoPDFwSoftClipMod1.tstwf
0dcafe876ea8574619664920ec5b1fdbff3ca218  ./workflows-from-will/AFPtoPDF_CE003A01.tstwf
0e55506bf5d7694d8cda9467a5809ea75c486fb1  ./workflows-from-will/workflow/change/pdf.change
0ec03992e19a12520f131f89cd9060c2e4ba2be2  ./workflows-from-will/AFPNOPIndexCallback.tstwf
0f1dca3e5d9b17f11c194b250096fc15891b9998  ./stapling/AFPtoPDFwStapling1.tstwf

さらに、追加の調査で削除したいファイルを隔離するのに役立つように見える「comm」コマンドが見つかりました。

ベストアンサー1

workflows.txtそのため、リストされているファイルを除いて、リストされているファイルを削除しようとしていますworkflows-sorted.txt。チェックサムを削除して名前をソートしたら、次のように実行してファイルのリストを取得できます。commに存在する行のみを抽出しますworkflows.txt。プロセス置換をサポートするシェル(ksh93、bash、zsh):

comm -23 <(<workflows.txt sed 's/^[^ ]*[ ][ ]*//' | sort) \
         <(workflows-sorted.txt sed 's/^[^ ]*[ ][ ]*//' | sort)

comm -232番目の引数()の行-2と2つのファイル()の両方の行のみを削除し、2番目の引数では-3なく最初の引数の行のみを保持します。これを行うには、comm入力ファイルを並べ替える必要があることに注意してください。

削除するには:

comm -23 <(<workflows.txt sed 's/^[^ ]*[ ][ ]*//' | sort) \
         <(workflows-sorted.txt sed 's/^[^ ]*[ ][ ]*//' | sort) |
xargs -I rm -- {}

ファイル名にスペースまたはxargs rmが含まれていない場合は、これらのオプションをサポートしている場合は最後の行に追加できます。すべてのファイル名がまたはで始まる場合は必要ありません(または開始しないことが保証されている項目)。rm\'"tr '\n' '\0' | xargs -0 rm --xargs -d '\n' rm --xargs--/./-

おすすめ記事