backup2.tar.bz2에는 있지만 backup1.tar.bz2에는 없는 모든 파일을 나열합니다.

backup2.tar.bz2에는 있지만 backup1.tar.bz2에는 없는 모든 파일을 나열합니다.

두 백업의 모든 파일이 크기별로 정렬되어 나열됩니다.

tar tvf backup1.tar.bz2 |sort -k3 -n >backup1_files.txt
tar tvf backup2.tar.bz2 |sort -k3 -n >backup2_files.txt

나는 나열하고 싶다backup2.tar.bz2에는 있지만 backup1.tar.bz2에는 없는 모든 파일, 크기별로 정렬됩니다.

어떻게 해야 하나요?


알아채다:

답변1

AWK가 있는 경우 다음과 같은 한 줄의 코드를 사용할 수 있습니다.

awk '{if (NR==FNR) { arr[$6]=1 } else { if (! arr[$6]) { print } } }' backup2_files.txt backup1_files.txt

그러면 백업 2의 파일 이름을 사용하여 AWK 배열을 구축한 다음 백업 1의 파일 이름이 배열에 있는지 확인합니다. 그렇지 않은 경우 인쇄됩니다.

편집: 이름에 공백이 있는 파일에 대해 더욱 강력하고 임시 파일이 필요하지 않은 향상된 버전은 다음과 같습니다.

 awk '{ key=""; for (i = 6; i <= NF; i++) { key=col_cat $i }; if (NR == FNR) { arr[key]=1 } else { if (! arr[key]) { print } } }' <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)

awk 코드를 파일에 작성 intersect.awk하고 다음과 같이 재사용할 수 있습니다.

awk -f intersect.awk <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)

답변2

tar가 인쇄하기 때문에 다른 답변에서 제안된 접근 방식은 작동하지 않습니다.

name123 symbolic link to namexyz

아카이브와 하드 링크에 심볼릭 링크가 있는 경우 비슷한 메시지가 나타납니다.

따라서 이 문제를 처리하는 유일한 방법은 다음을 사용하는 것입니다 star.

star -t -tpath < archive.tar.bz2 > somename

모든 아카이브에 대해 이 작업을 수행하고, 출력을 정렬하고, 잘 알려진 방법을 사용하여 결과 파일을 비교합니다.

이 옵션은 파일 이름이 한 줄에 한 번만 인쇄되도록 -tpath지시합니다 .star

star네, 그것의 일부입니다 schilytools.

참고: 이 방법은 파일 이름에 개행 문자가 포함된 경우 비교 도구를 혼동합니다.

관련 정보