tar 아카이브에서 파일 제거


17

많은 파일 foo.tar.xz(예 : 200000)을 포함 하는 큰 파일 이 있습니다. 이 아카이브에 내가 원하지 않는 (약 5000 개) 파일이 포함되어 있음을 알았습니다. 디스크에 모든 것을 압축 해제하기에 충분한 디스크 공간이 없습니다. 또한, 그렇게하면 속성 / 권리가 손실 될 수 있습니다. 그래도 압축 아카이브 의 두 복사본을 호스팅하기에 충분한 공간이 있습니다. 아카이브에서 개별 파일로 압축을 풀지 않고 아카이브에서 파일의 일부를 제거하는 도구가 있습니까 (파일 이름에 정규식으로 지정됨)?

답변:


15

GNU tar에는 --delete오늘날에도 아카이브와 작동 하는 옵션이 있습니다.

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

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

주의 : 대부분 의 자기 테이프 매체 에서는 작동 하지 않을 것입니다. 그러나 tar파이프에서 작업하는 데 아무런 문제가 없으므로 임시 tar 파일을 사용하고 그 후에 테이프를 덮어 쓸 수 있습니다. 압축 파일에서도 작동하지 않으므로 파일을 압축 해제해야합니다.

또한 tar 아카이브의 (선별 적으로) 패킹 된 선형 특성으로 인해 작업이 다소 느려질 수 있습니다.


1
존재하지만 무작위 액세스가 불가능한 파일 (예 : 압축 아카이브)에서는 작동하지 않지만 이것이 내 유스 케이스입니다.
FUZxxl

1
다른 문제는 삭제할 패턴을 지정할 수 없다는 것입니다. 이미 2013의 단점을 해결 한 내 의견에 주목하십시오 gtar --delete.
FUZxxl

4
@FUZxxl -T은 (와 --delete) 작동하며 --wildcards파일 이름 대신 패턴을 사용할 수 있으므로 패턴이 포함 된 임시 파일을 만들고을 사용하십시오 unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. 전체 정규 표현식을 수행하지는 않지만 (필요한 경우 tar -t파일 이름 목록을 사용하여 삭제하여 삭제) 파일 이름 일치 패턴 만 수행하십시오.
Random832

14

(내가 편집 된 질문을 오해 한 것처럼 편집 됨)

전체 파일을 추출, 삭제 및 다시 압축하는 것이 가장 좋습니다.

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

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

tar는 원래 임의 탐색을 잘 수행하지 않는 테이프 드라이브 용 스트림입니다. 이론적으로 디스크 파일 시스템에서 구멍을 뚫고 / 남은 파일을 다시 쓸 수 있으며, 압축을 사용하면 포인트가 전부는 아니더라도 대부분은 ot니다. 압축 방법은 파일에서 이전에 발생한 내용에 크게 의존합니다. 이를 위해서는 압축 방법과 tar 파일 형식에 대한 매우 자세한 지식이 필요합니다. 그것은 아무도 그것을 귀찮게하지 않을 정도로 복잡합니다. 파일을 보관하고 무시하는 것이 더 저렴합니다.

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


이러한 파일은 아카이브 크기의 35 %를 구성합니다. 당신이 지적한 제한 은 파일을 다시 쓰는 경우에만 적용됩니다 . 파일을 제자리에서 수정하지 않고는 할 수 있습니다 . (보관 아카이브를 두 번 저장할 수있는 충분한 공간이 있습니다 ). 그런 도구가 있습니까?
FUZxxl

그때 당신의 질문을 오해했을 수도 있습니다. 타르의 포장을 풀고 재 포장하려는 경우 (타르 파일을 직접 만들지 않고 즉, 직접 타르에서 타르 파이프로) 재 포장 할 수 있습니다.
frostschutz

그래, 할 수있어 파일에 유지해야 할 uids / gids / 속성이 있습니다. 또한 압축을 푼 표현을 저장할 디스크 공간이 부족합니다. 그래도 두 개의 압축 아카이브를 저장할 공간이 충분합니다.
FUZxxl

1
전혀 문제 없습니다. 한 번에이 작업을 수행 할 수 있으면 시간이 오래 걸리지 않습니다. 실제로 스토리지를 해제하면서 빠른 삭제를 허용하는 아카이브 형식을 상상할 수 없습니다.
FUZxxl

1
--wildcards도움이 ... ./하지만 패턴의 시작 부분 에 포함해야했습니다 ...
Gert van den Berg

-4

manual 에 따르면 파일 이름 목록을 전달하여 파일 이름 tar만 추출 할 수 있습니다. 예를 들면 다음과 같습니다.

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

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

--extract가 어떻게 도움이되는지 모르겠습니다. 좀 더 자세히 설명해 주시겠습니까? 아카이브 (또는 그 상당 부분)를 디스크에 압축 해제 할 수는 없습니다.
FUZxxl

2
링크 만 게시하지 마십시오. 이것은 위키입니다. 사람들이 귀하의 답변을 이해하기 위해 페이지를 떠날 필요가 없도록 충분한 컨텐츠를 추가하십시오.
jasonwryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.