두 백업의 모든 파일이 크기별로 정렬되어 나열됩니다.
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에는 없는 모든 파일, 크기별로 정렬됩니다.
어떻게 해야 하나요?
알아채다:
diff
일부 파일의 수정 날짜가 다르기 때문에 .txt 파일을 만드는 것은 작동하지 않습니다. 따라서 이 질문은 중복되지 않습니다.다른 파일에는 없는 한 파일의 행을 가져올 수 있는 도구가 있습니까?.삭제하면
v
수정 날짜가 제거되고 파일 크기도 제거되므로 크기별로 정렬할 방법이 없으므로 이는 옵션이 아닙니다.
답변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
.
참고: 이 방법은 파일 이름에 개행 문자가 포함된 경우 비교 도구를 혼동합니다.