tar 파일만 있고 디렉터리는 없습니다.

tar 파일만 있고 디렉터리는 없습니다.

파일을 찾은 다음 목록을 tar에 전달하기 위해 쉘 스크립트를 작성할 수도 있지만 단일 명령줄에서 이 작업을 수행할 수 있는 tar에 이미 내장된 기능이 있는지 궁금합니다.

예를 들어 스위치를 찾았 --no-recursion는데 이렇게 하면 다음과 같습니다.

tar --no-recursion -cvf mydir.tar mydir

디렉터리(하위 디렉터리 포함!)의 항목 이름만 보관하고 파일은 보관하지 않습니다.

나는 또한 다음을 시도했습니다.

 tar --no-recursion -cvf mydir.tar mydir/*

그러나 파일만 보관하는 동시에 보관도 합니다.이름하위 디렉토리.

디렉토리가 아닌 파일만 tar에 알릴 수 있는 방법이 있습니까?

답변1

findwith 를 사용하고 싶을 때 tar가장 좋은 방법은 cpionot 을 사용하는 것입니다 tar. cpio표준 입력에서 아카이브할 파일 목록을 얻는 것을 목표로 하는 tar 아카이브를 작성할 수 있습니다.

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

find및를 사용하면 파일을 선택하고 보관하는 데 필요한 모든 기능을 cpio활용할 수 있으므로 좀 더 유닉스 스타일의 접근 방식입니다 . 이 간단한 사용법을 배워두면 시도해 볼 때 직면하는 문제를 쉽게 해결할 수 있다는 것을 알게 될 것입니다 .findcpiocpiotar

답변2

camh가 지적했듯이 이전 명령에는 파일 이름이 너무 많으면 여러 번 실행되고 후속 호출은 이전 실행을 자동으로 지운다는 점에서 작은 문제가 있습니다. 또한 압축하지 않기 때문에 덮어쓰는 대신 추가할 수 있습니다.

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

요크나즈의 답변tar옵션 을 사용하는 것도 가능합니다. 이미 설치 하셨다면 ,--null-Tcpio캠의 대답사용하는 것도 좋습니다. 가지고 있고 zsh명령으로 사용해도 괜찮다면,자일스의 대답 zsh glob( *(.))을 사용하는 것이 가장 쉬운 것 같습니다.


핵심은 -maxdepth선택입니다. 최종 답변, 공백을 적절하게 처리하는 방법:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

이것은 또한 작동합니다:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

답변3

당신은 그것을 전혀 사용하지 않고 사용할 수도 있습니다 find ... -print0.tar ... --nullxargs

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

주어진 예에서는 파일 경로(디렉토리 아님)만 에서 로 전달되므로 --no-recursion옵션은 필요하지 않습니다 .tarfindtar

그러나 다음 예에서 옵션을 사용하면 --no-recursion디렉터리의 이중 아카이브가 방지됩니다. 대신 디렉토리 트리 재귀가 수행됩니다.tartarfindtar

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl

답변4

당신이 요구하는 것이 무엇인지 잘 모르겠습니다. mydir하위 디렉터리 대신 일반 파일을 저장하려는 경우 가장 쉬운 방법은 zsh를 사용하는 것입니다. 일반 파일만 일치시키려면 다음을 사용하세요.. 글로벌 예선:

tar cf mydir.tar mydir/*(.)

관련 정보