Linux 에서 여러개의 파일 각각 압축하기.

Developer 2009/12/03 09:27
흠.... 찾아보니 그냥
find . -name <regexp> -exec tar -jcvf {}.tar.bz2 {} \;

로 해결된다.
반대로 압축 풀때는
find . -name <regexp> -exec tar  -jxvf {} \;

로 된다.

이전 글.

리눅스에서 작업하다보면 몇 가지, 자주 없을 것 같지만, 의외로 자주 발생하는 상황들이 있는데, 그 중에서 하나가 여러개의 파일들을 각자 압축해야 하는 상황이다.

예를들어서 텍스트 파일들 A.txt 부터 Z.txt까지가 있고, 각각의 파일들을 압축해야 하는 경우가 있다. 이 경우에, 내가 알기로는 마땅히 방법이 없고, tar -jcvf (또는 -zcvf)로 각각의 파일을 압축하는 수 밖에 없다. 즉, 26번을 기다렸다가 해야한다.
파일들의 크기가 작으면 상관없지만, 파일당 압축하는데 몇십초 이상 걸리기 시작하면 이미 귀찮아지고, 뭔가 자동화된 툴을 찾게된다.

그래서 아래 셸 스크립트를 작성해보았다. 초기 버젼이라 뭔가 안되는 것도 많을 것 같지만, 나름 괜찮아 보인다. ㅋㅋ
이름은 cbtar.sh (create bzip tar)

사용 방법은 간단하다.
cbtar.sh *.txt

현재  디렉토리 안의 모든 txt파일들을 각각 압축한다.

2009.12.09 업그레이드:
`basename $1`.tar.bz2를 추가해서 현재 디렉토리에 tar파일이 생성되게 한다.

#!/bin/bash
# This script creates tar.bz2 files for each given file name
# Author: MyungHyun Lee (Kent)  2009.12.03
# thicliwin@gmail.com

# for each directory (with the maxdepth)
echo "Number of compressed files to create: $#"
if [ $# -ge 1 ]
then
    #files = $*

    while [ "$*" != "" ]
    do
        echo "Running...  tar -jcvf `basename $1`.tar.bz2 $1"
        tar -jcvf `basename $1`.tar.bz2 $1
        shift
    done

else
    echo "Usage: cbtar.sh "
    exit
fi#eof


저작자 표시 비영리 변경 금지
Trackback 0 : Comment 0

트위터 & Flickr 연동 테스트

gossip 2009/11/12 14:01

오늘 다음 기사를 읽다가 트위터 연동되는 곳이 많아졌다는 기사를 읽고, 얼마전에 싸이랑 트위터랑 연동한게 생각났다. 찾아보니깐 tistory도 가능. 테스트중.

natura classica



아.... 플리커 연동은 플리커에 올린 사진을 가져오는 연동을 말하는 거였구나..
저작자 표시 비영리 변경 금지
Trackback 0 : Comments 2

git_remote_branch (grb)

Developer 2009/10/27 19:58
Git를 사용하는데 있어서 쓸만한 커맨드들을 알아서 실행시켜주는 스크립트.
그 자체로도 유용하기도 하지만, git explain <command>를 통해서 git를 직접 사용하는 방법을 공부해 볼 수도 있다.
http://github.com/webmat/git_remote_branch

저작자 표시 비영리 변경 금지
Trackback 0 : Comment 0

..

black & white 2009/09/23 23:20

400tx :: yashica mat 124
저작자 표시 비영리 변경 금지
Trackback 0 : Comment 0

Ruby: shuffling an array (배열 shuffle)

Developer 2009/09/16 09:28
프로그래밍을 하다보면 배열을 랜덤하게 재배열해야 하는 경우가 생긴다. 지금까지 그런 경험이 없다고 한다면, 곧 생길 것이다. 내 경우에는 테스트 케이스를 랜덤하게 재배열 해야하는 경우가 간혹 있었던 것 같다. 최근에 작성한 스크립트에서도 단어 리스트를 읽어들여서 중복을 없애고, 리스트를 재배열 해야하는 문제가 생겼다. 그래서 인터넷을 뒤져서 괜찮은 정보를 좀 알아냈다.
(참고로 중복을 없애는데는 Array 클래스의 uniq 함수를 사용하면 된다)

처음 찾은 링크는
http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/8342fc2896843e7d/f909568cb1a8f931?lnk=raot
이곳이다. 이 링크를 보고 구현해서 어제 사용하고는, 오늘 블로그에 정리하려고 다시 찾았는데, 찾다가 조금 더 깔끔하게 정리가 된 아래 링크를 찾았다.
http://codeidol.com/other/rubyckbk/Arrays/Shuffling-an-Array/

사실 위에 두 링크를 참고하면 되는데, 여기에도 정리를 해둬야 겠다 싶어서 다시 정리한다.
여기서 보여주고 싶은 방법은 두 가지다.

1. 간단 한 방법

class Array
    def shuffle!
        sort_by { rand }
    end
end


정말 간단하지 않은가... 루비의 힘. 뭐 이런거..
시스템에서 정의 된 Array클래스를 재정의 해서 shuffle 함수를 추가했다.


2. 조금더 복잡한 방법
이 방법은 Fisher–Yates shuffle 을 사용한다. (위에 첫번째 링크에서 언급)
이방법의 장점은 복잡도가 O(n) 밖에 안된다는 것이다. 웬만한 정렬 알고리즘은 O(nlogn)이다. 또한 링크에서 말하길, unbiased, 치우치지 않는 결과를 보여준다고 한다.

class Array
  # Shuffle the array
  def shuffle!
    n = length
    for i in 0...n
      r = Kernel.rand(n-i)+i
      self[r], self[i] = self[i], self[r]
    end
    self
  end

  # Return a shuffled copy of the array
  def shuffle
    dup.shuffle!
  end
end


아까 1번 예제에서 빼놓고 shuffl!만 구현했었는데, 이 코드에는 shuffle 함수의 코드도 있다. 이또한 간단하다. (루비에서 함수 이름뒤에 "!" 느낌표가 오면 객체 자신에게 함수를 수행하고, 그렇지 않으면 수행한 결과를 새로운 객체로 리턴한다는 약속이 있다.)


일단 루비에서만 구현했는데, 사실 c++ 를 비롯한 어떠한 언어에서도 충분히 구현해서 활용할 수 있을 것 같다. 다만, srand이 함수내에서 불리지 않은 점을 생각해보면, srand 함수가 어떻게 불리느냐에 따라서 결과가 조금 달라질 수도 있을 것 같다.


저작자 표시 비영리 변경 금지
Trackback 0 : Comments 2
◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [34] : NEXT ▶