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



트위터 & Flickr 연동 테스트

gossip 2009.11.12 14:01

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

natura classica



아.... 플리커 연동은 플리커에 올린 사진을 가져오는 연동을 말하는 거였구나..

git_remote_branch (grb)

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


..

black & white 2009.09.23 23:20

400tx :: yashica mat 124

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 함수가 어떻게 불리느냐에 따라서 결과가 조금 달라질 수도 있을 것 같다.