tar 아카이브에서 파일 제거

tar 아카이브에서 파일 제거

foo.tar.xz많은(예: 200000) 파일을 포함하는 대용량 파일이 있습니다 . 나는 이 아카이브에 내가 원하지 않는 일부 파일(약 5000개)이 포함되어 있다는 것을 발견했습니다. 전체 파일을 내 디스크에 압축 해제할 디스크 공간이 충분하지 않습니다. 또한 이렇게 하면 속성/권한이 손실될 수 있다는 걱정이 됩니다. 두 장을 복사할 공간이 충분해요압축하지만 아카이브. 아카이브(파일 이름에 정규 표현식으로 지정)에서 즉석에서, 즉 아카이브를 별도의 파일로 압축을 풀지 않고 특정 파일을 제거할 수 있는 도구가 있습니까?

답변1

GNU tar에는 --delete이제 아카이브 처리 옵션도 있습니다.

예를 들어 다음과 같이 사용하십시오.

tar -vf yourArchive.tar --delete your/path/to/delete

다음을 방지하세요:아마아니요모든 유형의 테이프 미디어에서 작동합니다. 하지만 tar파이프라인 작업에는 문제가 없으므로 임시 tar 파일을 사용하고 해당 파일로 테이프를 덮어쓰면 됩니다. 또한 압축된 파일에서는 작동하지 않으므로 파일의 압축을 풀어야 합니다.

또한 tar 아카이브 압축의 선형적 특성으로 인해(설계상) 어떤 경우에도 작업 속도가 상당히 느려집니다.

답변2

(질문을 잘못 이해해서 수정했습니다)

당신이 할 수 있는 최선의 방법은 전체 파일을 추출하고, 삭제하고, 다시 압축하는 것입니다.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

파일은 tar에서 직접 삭제할 수 없습니다.

tar는 원래 무작위 검색을 제대로 수행하지 못하는 테이프 드라이브에 사용되는 스트림입니다. 이론적으로는 디스크 파일 시스템에 구멍을 뚫거나 나머지 파일을 압축하여 다시 쓰는 것이 가능하지만 대부분의 경우에는 의미가 없습니다. , 전부는 아니지만 압축 방법은 파일의 앞부분에 나타나는 내용에 크게 의존합니다. 이를 올바르게 수행하려면 압축 방법과 tar 파일 형식을 아주 자세히 이해해야 합니다. 너무 복잡해서 아무도 신경쓰지 않을 거예요. 파일을 보관하고 무시하는 것이 더 저렴합니다.

이 기능이 필요한 경우 tar는 아마도 원하는 것이 아닐 것입니다.

답변3

에 명시된 바와 같이가장 많이 투표된 질문,GNU 타르--delete이 문제를 해결하는 것으로 보이는 옵션을 구현했습니다 .

하지만인용하다나우모프논평:

참고: 이 명령은 tar 파일을 손상시킬 수 있습니다. 불행히도, 그것은 내 것을 망쳤고 나는 백업 복사본을 만들지 않을 만큼 어리석었습니다. 원인이 무엇인지 잘 모르겠지만 제 경우에는 각 파일에 대해 수천 개의 복제본이 생성되기 시작했습니다. 아카이브 크기가 원래 크기의 10배로 늘어났기 때문에 프로세스에 SIGTERM을 실행해야 했지만 이 시점에서 데이터가 손실되었습니다.

적어도 tar 버전 v1.30을 사용하여 재현할 수 있습니다.버전 v1.34에서는 발생하지 않습니다.. armhf 및 i386 아키텍처에 영향을 미칩니다.

파일을 삭제하려고 하면존재하지 않는다tar 파일 내에서 중복 항목이 나타나기 시작하고 전체 파일이 손상될 수 있습니다.

tar업그레이드가 불가능한 경우 해결 방법은 --listtar 파일( )의 모든 파일을 나열하고 delete 를 사용하기 전에 파일이 존재하는지 확인하는 것입니다 --delete.

답변4

~에 따르면수동, 파일 이름 목록을 전달하여 tar해당 파일 이름만 추출할 수 있습니다. 예를 들어:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

관련 정보