두 텍스트 파일의 차이점을 기반으로 파일 삭제

두 텍스트 파일의 차이점을 기반으로 파일 삭제

아래와 같이 두 개의 .txt 파일을 만들었습니다.

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

하나는 특정 디렉터리에서 .change 또는 .tstwf로 끝나는 모든 파일의 목록이고, 다른 하나는 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과 두 파일( )에 모두 있는 줄만 제거하여 -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 이외의 다른 이상한 문자 \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).

관련 정보