2010-04-08 7 views
50

파일 이름을 지정하는 tar에 어떻게 정보를 파이프 할 수 있습니까? 대신 당신이 역 따옴표를 사용할 수있는 파이프를 사용stdin에서 tar를 빌드하려면 어떻게해야합니까?

+0

@geekosaur는 질문에 더 잘 맞는 응답이기 때문에 체크해야한다고 생각합니다. –

+0

내가 선택한 답변을 변경했습니다. –

답변

80

뭔가 같은 :

tar cfz foo.tgz -T - 

그러나 가능한 모든 파일 이름에 대해서는 작동하지 않습니다. --null 옵션을 고려하고 tarfind -print0에서 가져와야합니다. 합니다 (xargs 예제는 여러 tar 명령을 큰 파일 목록에 대한 꽤 업무를 생성합니다 때문입니다.)

5

, 예를 들어, 대신 ls -1 *

tar cvzf archive.tgz `ls -1 *` 

당신은 보관에 필요한 파일

의 목록을 생성하는 다른 명령을 넣을 수 있습니다
+10

유일한 것은 ls 명령의 출력이 쉘의 최대 허용 명령 행 크기보다 길면 작동하지 않는다는 것입니다. 그런 경우에, 당신은 다른 대답 중 하나로서 그것을해야합니다; 목록이 임의로 길어질 수 있습니다. 또한 "find [...] -print0"은 특수 문자가있는 멤버가있는 tar 파일을 만들 수 있습니다. 여기서 ls 메서드는 그렇지 않습니다. 이 방법은 안전하지 않거나 보편적으로 적용 할 수 없습니다. –

3
find /directory > filename 
tar -T filename -cf archive.tar 
20

으로 이미 geekosaur 지적, 파이프 필요가 xargsfind의 출력이없는 그것 때문에 find ... -print0 | tar --null ...을 사용하여 의 출력을 tar에 직접 연결할 수 있습니다.

아카이브 파일을 제외 할 때 gnutarbsdtar의 약간의 차이점에 유의하십시오.

# exclude file.tar.gz anywhere in the directory tree to be tar'ed and compressed 
find . -print0 | gnutar --null --exclude="file.tar.gz" --no-recursion -czf file.tar.gz --files-from - 
find . -print0 | bsdtar --null --exclude="file.tar.gz" -n -czf file.tar.gz -T - 

# bsdtar excludes ./file.tar.gz in current directory by default 
# further file.tar.gz files in subdirectories will get included though 
# bsdtar: ./file.tar.gz: Can't add archive to itself 
find . -print0 | bsdtar --null -n -czf file.tar.gz -T - 

# gnutar does not exclude ./file.tar.gz in current directory by default 
find . -print0 | gnutar --null --no-recursion -czf file.tar.gz --files-from - 
+0

현재 디렉토리에서 찾으면 대상으로 ../file.tar.gz를 사용하는 것만으로도 충분합니다. –

13

geekosaur answer 확장 :

find /directory | tar -cf archive.tar -T - 

당신은 -T 옵션을 사용하여 표준 입력을 사용할 수 있습니다. 당신은 일반적으로 어떤 조건 (예를 들어 -name 옵션)을 사용하여 파일을 필터링 할 경우 에 필요

참고는 당신이 원하는 것을하지, 그렇지 않으면 타르 모든 콘텐츠를 처리 할 파이프에 디렉토리를을 제외 할 수 있습니다. 그래서, 사용

find /directory -type f -name "mypattern" | tar -cf archive.tar -T - 

당신이 -type를 사용하지 않는 경우

"mypattern" 일치하는 디렉토리의 모든 내용이 추가됩니다!

+0

나는이 방법이 다른 것보다 낫다고 생각한다. 왜냐하면 당신은 stdout으로 어떤 것을 출력 할 수 있기 때문이다. – daks

+0

'find'를 사용하여 파일 유형에 대해 구체적으로 생각하고 싶을지도 모른다. 구체적으로'find -type f'를 할 것입니다. 이것은 심볼릭 링크, 문자 장치 등을 제거합니다. 'find -type f -o -type d'보다 빈 디렉토리에 관심이 있다면. – JamesThomasMoon1979

0

더 나은 압축을 위해 bzip2를 사용하면 도움이 될 수 있습니다.

find $PWD -name "*.doc" > doc.filelist 
tar -cvjf jumbo.tar.bz2 -T doc.filelist 
관련 문제