以下のように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 -23
2番目の引数()の行-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
--
/
./
-
答え2
ファイル名にスペースが含まれていない場合は、削除する重複ファイルのリストが表示されます。
awk 'c[$1]++' workflows.txt > erasefiles.txt
その後、すべてを削除します(bashで正確に必要な操作が行われることを確認するまで最初にechoを使用してください)。
rm $(awk '{print $2}' erasefiles.txt)
ファイルにスペース(または改行\n
とゼロ以外の他の奇妙な文字\0
)がある可能性がある場合:
awk '{$1=""; print}' erasefiles.txt | tr '\n' '\0' | xargs -0 -r rm --
答え3
一つのために使い捨て職場ではdiff
、出力から始めて削除するファイルのリストを編集します(sed(1)
面倒な場合は、そのタスクをPerlスクリプトまたは同様のスクリプトに任せてください)。リストをもう一度確認してからbash(1)
(!)で実行してください。
rm $(< list-of-files-to-axe)
-f
味を出すか、-i
ラベルを貼ることができます。
これを自動化するには、より多くの作業が必要であり(そしてあまりにも多くのトラップが発生する)、時々使用する価値があります。再利用するには、PerlやPythonなどの強力なスクリプト言語で書いてください。などの特殊目的言語を離れてくださいawk(1)
。