디렉토리 구조가없는 .tar 파일


32

.tar경로로 일부 파일을 보내고 example/super_user/Output.*.

결과 .tar는 다음과 같습니다.

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

그러나 파일이 다음과 같기를 원합니다.

- Output.zip
- Output.xml
- Output.txt

여전히 다른 디렉토리에있는 동안 어떻게이 작업을 수행 할 수 있는지 알고 있습니까?


그런 아카이브가있는 타 폭탄 을 피하십시오 .
grawity

tar --strip-components = 1000?
Zaar Hai

답변:


11

tar는 파일과 폴더 구조를 보존하므로 tar가 생성 시점에 계층 구조를 평평하게 지시하는 방법이 없다고 생각합니다.

한 가지 해결 방법은 디렉토리를 일시적으로 변경하고 tar를 만든 다음 돌아가는 간단한 예입니다.

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

'example'디렉토리가 파일 시스템의 루트에있는 경우 다른 방법은 다음과 같습니다.

tar -C /example/super_user -cvf result.tar .

그러면 tar를 수행 할 지점으로 디렉토리가 변경됩니다. 주의 사항은 / example / super_user 아래에 하위 디렉토리가 있으면이 하위 디렉토리에 대해 디렉토리 구조가 유지된다는 것입니다.


1
이것이 당면한 문제에 대한 해답입니다. 이 경우 언급 된 경고는 문제가되지 않습니다. 다른 모든 답변은 문제의 변형을 설명하는 해결 방법입니다.
joki

이것이 바로이 질문에 대한 해결책입니다. 디렉토리는 디렉토리 구조를 가정하여, 루트가 될 필요가 없습니다 /home/u/foo/bar디렉토리를 작업하는 것입니다, /home/b다음, tar -C foo/bar -cvf qiz.tar .잘 작동합니다. 하나주의해야하지만, 당신은 즉, 와일드 카드를 사용할 수 없다는 것입니다 tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"또는 tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"작동하지 않습니다.
Brice

1
여러 디렉토리에 분산 된 여러 파일을 추가해야하지만 tar 파일은 평평하게하려면 -C단일 tar명령 에서 여러 번 사용할 수 있습니다 .
zero298

10

내 답변을 여기에 게시했습니다.

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

재 게시 (게으른 ppl 용)


이것은 추악하지만 ... 작동합니다 ...

나는이 같은 문제가 있었지만 여러 개의 폴더로 모든 파일을 평평하게 만들고 싶었습니다. "transform"옵션을 사용하여 sed 표현식을 전달하면 예상대로 작동합니다.

이것은 표현입니다.

's/.*\///g' ( '/'앞의 모든 것을 삭제하십시오)

이것이 최종 명령입니다 :

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

상위 디렉토리 정보 (./도 포함하지 않음)없이 디렉토리 (DIR)의 모든 파일을 사용하여 tar (ARCHIVE.tar)를 작성하려면 다음과 같이 사용할 수 있습니다.

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

찾기로 재생하여 깊이를 제한하고 특정 파일을 선택할 수 있습니다.

행운을 빕니다!


OSX find 명령에 "find : -printf : unknown primary or operator"가 표시됩니다. 팁이 있습니까?
TCB13

-printf비표준 명령입니다. 이들 중 다수는 특정 버전의 찾기에서만 작동합니다. 일반적으로 수퍼 유저 에 대한 질문에 답변 할 때 표시합니다 (예 : "-blah는 Gnu 확장이며 모든 곳에서 작동하지 않습니다").
Hennes

3

임시 디렉토리를 만들었습니다. 그리고 디렉토리에서 포함 할 파일에 대한 모든 파일에 대한 심볼릭 링크를 만들었습니다. 그런 다음 tar -h -C을 수행했습니다. 모든 파일 (링크가 아니라 내용)이 원하는 이름으로 아카이브에 포함되도록합니다.


1

이것이 tarball의 전체 내용이라면 GNU tar의 --strip-components옵션을 사용 하여 파일보다 2 레벨을 제거 할 수 있습니다 .


옵션 만 가지고 --strip-path있지만 사용해도 아무런 변화가 없습니다.

1

디렉토리를 임시로 변경하는 또 다른 방법은 cdtar명령을 괄호 안에 넣는 것입니다 ( ).

(cd example/super_user; tar -cvf ../../result.tar *)

이것의 장점은, 블록이 완료 될 때 항상 원래 디렉토리로 내재적으로 팝업됩니다. 즉 pushd.. popd블록이 필요 하거나 어디로 cd돌아갈 지 추적 할 필요가 없습니다 .


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd는 현재 디렉토리 경로를 DIR스택으로 푸시하고 컨텐츠 폴더로 이동합니다. 그런 다음을 사용하여 원래 디렉토리로 다시 이동 popd합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.