파일을 찾은 다음 목록을 tar에 전달하기 위해 쉘 스크립트를 작성할 수도 있지만 단일 명령줄에서 이 작업을 수행할 수 있는 tar에 이미 내장된 기능이 있는지 궁금합니다.
예를 들어 스위치를 찾았 --no-recursion
는데 이렇게 하면 다음과 같습니다.
tar --no-recursion -cvf mydir.tar mydir
디렉터리(하위 디렉터리 포함!)의 항목 이름만 보관하고 파일은 보관하지 않습니다.
나는 또한 다음을 시도했습니다.
tar --no-recursion -cvf mydir.tar mydir/*
그러나 파일만 보관하는 동시에 보관도 합니다.이름하위 디렉토리.
디렉토리가 아닌 파일만 tar에 알릴 수 있는 방법이 있습니까?
답변1
find
with 를 사용하고 싶을 때 tar
가장 좋은 방법은 cpio
not 을 사용하는 것입니다 tar
. cpio
표준 입력에서 아카이브할 파일 목록을 얻는 것을 목표로 하는 tar 아카이브를 작성할 수 있습니다.
find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar
find
및를 사용하면 파일을 선택하고 보관하는 데 필요한 모든 기능을 cpio
활용할 수 있으므로 좀 더 유닉스 스타일의 접근 방식입니다 . 이 간단한 사용법을 배워두면 시도해 볼 때 직면하는 문제를 쉽게 해결할 수 있다는 것을 알게 될 것입니다 .find
cpio
cpio
tar
답변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
-T
cpio
캠의 대답사용하는 것도 좋습니다. 가지고 있고 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 ... --null
xargs
find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -
주어진 예에서는 파일 경로(디렉토리 아님)만 에서 로 전달되므로 --no-recursion
옵션은 필요하지 않습니다 .tar
find
tar
그러나 다음 예에서 옵션을 사용하면 --no-recursion
디렉터리의 이중 아카이브가 방지됩니다. 대신 디렉토리 트리 재귀가 수행됩니다.tar
tar
find
tar
# 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/*(.)