linux

Total 136
Today 0
profile_image
ino
07-12-03 10:37 0개 3,725회
원하는 파일만 tar 로 압축하기
출저 : http://monoline.co.kr/zero/view.php?id=outsider&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=hit&desc=desc&no=65



이 름 난할난

Homepage http://phpsarang.com

제 목 xargs와 tar로 파일 묶을 때 생각할 것





10000개가 넘는 파일 중 a~e로 시작하는 파일 2000여개만 tar로 묶을 때 어떻게 해야할까?

몇가지 방법을 얘기해보자.





1) tar cvf /BAK/a_e.tar [a-e]*



2) find . -name "[a-e]*" > list.txt

  tar cvf /BAK/a_e.tar `cat list.txt`



3) find . -name "[a-e]*" | xargs tar cvf /BAK/a_e.tar







1번째 방법은



a~e로 시작하는 이라는 아주 간단한 조건이기에 tar 명령만으로도 처리하려고 시도할 수

있을 것이다. 그러나 여기에 퍼미션이 644인 것이라는 조건이 더 붙는다면 find 명령과의

조합으로 처리하는게 훨씬 간단할 것이다.

물론 저 방법을 쓰더라도 인수(argument)가 너무 많다고 에러가 발생할 것이다.



2번째 방법은



- a~e로 시작하는 파일목록을 얻어 list.txt로 저장하고

- list.txt 목록을 통해 a_e.tar 파일명으로 묶는다.



그러나 cat list.txt 명령으로 넘겨 받은 인수(argument)가 2000여개면 너무 많아 1번 처럼

에러가 발생할 것이다. 그래서 보통 저 방법보다는 xargs 명령을 통해서 처리를 한다.



3번째 방법은



2번보다는 고단수(?)의 방법이다.



- a~e로 시작하는 파일 목록을 얻어

- xargs로 넘기면 xargs는 tar로 그 목록을 다시 넘겨

  a_e.tar 파일명으로 묶는다.



이 방법은 앞의 1,2번의 문제였던 인수가 너무 많다는 에러가 발생하지 않고 정상적으로

묶어진 것처럼 보인다.



그러나 tar tvf a_e.tar | wc -l 명령으로 묶어진 파일이 몇 개인지 확인을 해보라.

원하는 결과가 나왔는가? 전혀 아닐 것이다. 2000여개가 아니고 몇 백개 또는 몇 십개의

파일만 묶여 있을 것이다.





--------------------------------------------------------------------------------



이제 해결책을 알아보자.



해결책 1) xargs의 -n과 -s 옵션을 활용하는 방법





find . -name "[a-e]*" | xargs -n 20000 -s 80000 tar cvf /BAK/a_e.tar







-n 는 최대 인수(argument) 개수를 지정한다.

-s 는 인수의 최대 문자수를 byte로 지정한다. 기본 20Kbytes.

파일이 많거나 경로가 길어지면 20Kbytes 로는 턱없이 부족하다.



위처럼 -n 옵션과 -s 옵션으로 조합으로 파일을 묶을 수 있다.

20000과 80000이라는 숫자는 넉넉한 임의의 숫자이다.



해결책 2) tar의 -T 옵션을 사용하는 방법





find . -name "[a-e]*" > list.txt

tar cvf a_e.tar -T list.txt







목록을 얻어 list.txt로 저장한다. 그리고, tar의 -T옵션은 지정한 파일에서 목록을 얻어

파일을 묶는다.



tar의 -T 옵션을 해결하는 것이 xargs의 -n, -s에 이것저것 고민(?)해보고 적당한 숫자를

지정하는 것보다 사용이 편할 것이다.

댓글목록

등록된 댓글이 없습니다.