아래와 같이 두 개의 .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)
.