스크립트 만들어 게을리 살자 (3)

매뉴얼
자, 2편에서 우리는 img_resize 라는 스크립트를 만들었다. 이걸 좀 더 우리의 욕망을 충실히 담도록 진보시키자.
하지만 그전에, 도대체 우리가 뭘 하고 있는지 실제로 확인해야 좀 더 신이 날 것 같다. 저렇게 만든 스크립트를 어떻게 실행하고, 활용할지 보자.

우선, 리눅스는 보안을 위해 적절한 권한이 없으면 말을 안듣는다.
img_resize 가 실행하려면 먼저 이 파일에 "실행권한"을 줘야 한다. 그냥 여기서 이해하던 못하던 아래처럼 하자.

$ chmod +x img_resize

1, 2 편에서 설명 안했지만, "$"로 시작하는 줄은 실제로 그렇게 타이핑하라는 것인데, 리눅스에서 터미널을 열면


그림의 맨 아래보면 커서(cursor)가 깜박이고 있다. 이 상태에서 타이핑을 하면 된다. $ 뒤의 내용만 치시라.
혼동을 막기 위해 위의 예를 충실히 반영하면,

mediaction:~/Desktop/images$
mediaction:~/Desktop/images$ chmod +x img_resize

자, 이제 img_resize 를 실행할 수 있다. 아래처럼 한다.

mediaction:~/Desktop/images$ ./img_resize

일단은 많은 거 생각 말고 그냥 그렇게 하자.

자, 이제 파일 관리자(GUI)를 열어 이미지를 열어보자. 지금 디렉토리(~/Desktop/images)에 있는 모든 이미지 크기가 640 x 480으로 되어 있을 것이다.

그럼 어떻게 해야 잘 썼다고 소문이 날까? 집에서 윈도우를 쓰고 있다가 이미지 작업을 할 일이 생겼다고 하자. 디카로 찍은 사진을 어디 올리거나 하려고 파일 크기를 줄이려는데 그게 백마흔아홉장이다.
우선 주변에 리눅스를 쓰는 사람이 있는지 섭외한다. 그리고 그 사람의 컴퓨터에 FTP등의 방법으로(USB로 옮겨도 되고 여튼 어떻게든 해서) 이미지와 이 스크립트 파일(텍스트)을 보낸다. 그리고 그 사람이 스크립트를 한번 실행해 준다음, 다시 이미지 파일들을 가져오거나, 거기서 바로 올리면 되겠다.

-------- 스크립트 업그레이드 하기 ---------
앞에서 만든 img_resize 스크립트 내용을 다시,

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         convert -resize 640x480 *.png
    fi
done

자, 이제 무엇을 할까? 이것만으로도 삶이 많이 윤택해질 수 있지만, 기왕 게을러지는거 조금 더 게을러지자. 이 스크립트는 폭이 640보다 넓은 걸 모두 640x480 크기로 바꿔주는데, 앞에서 일단 우리가 접었던 욕망을 떠올려보자. 이 스크립트는 위 아래로 길쭉한 파일도 640 x 480, 즉 옆으로 넓죽한 이미지로 만들어버린다. 이건 우리가 원하는게 아니다. 길쭉한 것은 손대지 않게 하자.

그럼 이 스크립트가 추가로 할 일은, 이 이미지가 넓죽이인지 길쭉이인지 알아내는 것, 이건 어떻게? 폭(width)이 크냐 높이(height)가 크냐를 비교해보면 되겠지. 위 스크립트는 이미지 폭만 알아냈는데, 높이를 알아내는 부분을 추가하자. 역시 일단 지금은 복사&붙이기(Copy&Paste).

imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`

스크립트를 이렇게 바꾼다.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    이미지높이를 알아내고,
    if [ $imgwidth -gt 640 ]; then
         이미지가 넓으면
              convert -resize 640x480 *.png
         한다.
    fi
done

컴퓨터 말로 바꾸기 시작.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         이미지가 넓으면
              convert -resize 640x480 *.png
         한다.
    fi
done

이미지가 넓다면 [ 폭 > 높이 ] 이다.
if [ 폭 -gt 높이 ]; then
    바꾸기.
fi

이번 단계의 최종 결과.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         if [ $imgwidth -gt $imgheight ]; then
              convert -resize 640x480 *.png
         fi
    fi
done

--------

이제 다음 단계 : 위아래로 길쭉한 모양일 경우, 폭은 640, 높이는 비율을 맞춰 크기 조정하기.

자, 이제 컴퓨터에게 계산을 좀 시키자. 2편에서 살짝 나왔지만, 위아래로 길쭉하고 폭이 640보다 큰 이미지를 640x???로 변형한다면, 새 높이는?

원래 높이 : 원래 폭 = 새 높이 : 640
새 높이 = 원래 높이 곱하기 640 나누기 원래 폭

새 높이를 계산해서 new_height 라는 곳(변수,variable)에 써놓기로 한다면, 코드는 아래처럼 된다.

new_height=$(( ($imgheight * $640) / $imgwidth ))

식이 저렇게 되는건 bash 라는 녀석이 까칠하기 때문이니 그냥 저런가보다 하세요. -_- 저대로 복사해 붙여넣길. 띄어쓰기도 중요하므로.

자, 스크립트 코드는 이렇게 바꾸자.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         이미지가 넓으면
              convert -resize 640x480 *.png
         하고, 안그러면
              새 높이를 계산한 후,
        
     convert -resize 640x새높이 *.png
         한다.
    fi
done

자, 새로운게 나올 타이밍. "~하면 ~한다." 가 if... then.. fi 라면, "~하면 ~하고, 아니면 ~한다."는 if... then... else... fi.

if [ 조건 ]; then
    참일때 할일
else
    거짓일때 할일
fi

스크립트 코드에 넣자

#! /bin/bash

for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         if [ 이미지가 넓다 ]; then
              convert -resize 640x480 *.png
         else
              새높이를 계산한 후
        
     convert -resize 640x새높이 *.png
         fi
    fi
done

자, 이제 코드를 완성하자.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         if [ $imgwidth -gt $imgheight ]; then
              convert -resize 640x480 *.png
         else
              new_height
=$(( ($imgheight * $640) / $imgwidth ))
              convert -resize 640x$new_height *.png
         fi
    fi
done

자, 이것으로 우리가 원하는 작업을 한번에 해결해주는 스크립트를 일단 완성했다. 앞으로 살면서 "이 디렉토리에 있는 모든 PNG이미지의 크기를 640x480 으로 바꾸고 싶어. 더 작은 건 냅두고, 위아래로 길쭉한 것은 폭만 640으로 하고." 이런 일이 생길때는? 그저 i m g _ r e s i z e 라고 10 글자 타이핑 후 엔터 치면 끝난다는 거~.

기쁘다. 이제 내가 해야 할 단순반복노동 중 한 가지가 줄었다. 하지만, 여기까지 내친김에 더 욕심이 난다. 이 스크립트는 현재,
1. PNG 이미지만 처리할 수 있다.
2. 원하는 폭이 640 x 480 이 아닌경우는 파일을 열어 수정하고, 다시 실행해야 한다. 바뀔 때마다.
3. 원본 파일을 따로 유지해두고 싶은데 그러려면 어딘가에 수동으로 파일들을 복사해줘야 한다.
4. 버그가 있(을 것이)다.

자, 4번을 빼고는 인정할 수 있을 것 같다. 그럼 그건 이 다음편에.
(근데 다른 일을 좀 해야 하니 다음편은 조금 더 늦을 듯 -_-)






진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크
2007/07/13 22:13 2007/07/13 22:13
Trackback Address :: http://blog.jinbo.net/h2dj/trackback/477
Name
Password
Homepage
Secret

스크립트 만들어 게을리 살자 (2)

매뉴얼
컴퓨터는 인간이 원하는 것중 피곤하고 짜증나는 것을 대신해 주는게 큰 목적이다. 전에도 얘기했듯이 컴퓨터가 인간을 오히려 피곤하게 한다거나, 능히 쉽게 할 수 있는 것을 어렵게 계속 하고 있는 것은 바라던게 아니겠지.

컴퓨터는 열나 단순해서 하나부터 열까지 일일히 말해줘야 한다. 그리고 뭐든지 정확히 설명해줘야 한다.
"TV를 켜라!"는 말을 들으면 사람은 바로 이해하고 어케어케해서 티비를 켜겠지만, 컴퓨터가 알아듣기 위해서는,
"TV의 전원을 넣어라" -> "TV의 리모콘이 있다면, 거기에서 전원 버튼을 찾아서, 그것에 적당한 압력을 가해 눌러라. 리모콘이 없다면 TV본체에서 전원 버튼을 찾아서, 역시 적당한 압력을 가해 눌러라" 라고 말해줘야 한다.
즉, 컴퓨터에게 일을 시키기 위해서는 컴퓨터가 얼마나 단순무식한지 알고, 인간이 습관적으로 쉽게 하는 간단한 일이 사실은 어떤 중간 과정들이 있는건지 재발견할 필요가 있다.

프로그램을 짠다는 것은 컴퓨터에게 "이러저러해라"하는 지시문을 작성하는 것인데, 좋은 프로그램은 컴퓨터 기술에 대한 지식만으로 나오지 않는다. 내게 좋은 프로그램이란, 바로 지금 내가 원하는 걸 부담없이 해주는 프로그램일 것이다.

나와 컴퓨터, 그리고 환경에 대한 이해가 바탕이 되서, 실제 일이 어떻게 이루어질(지는)지에 대한 상상력이 풍부한 사람이 좋은 프로그램을 짤 수 있다. 엄청 복잡하고 덩치만 크지, 실제로 내가 많은 추가작업을 앞뒤로 해줘야 한다던지, 지금 당장 필요한데 쓸 수 없다던지 하는 것은 "내게 좋은" 프로그램은 아니다. 가장 "내게 좋은" 프로그램은 사실 자기 자신이 만들 수 있을 거라고 본다. 만일 가능하다면, 나는 모든 컴퓨터 사용자가 프로그래머가 되는 것이 가장 바람직하다고 생각한다. 프로그램을 짜는데 있어 컴퓨터 관련 지식의 비중은 생각보다 크지 않다는 걸 말하고 싶다.

자, 그럼 서론은 슬슬 접고,
프로그램을 짜는데 있어 제일 먼저 할일은,
"내 욕망을 정확히 표현하기"이다. 난 뭘하고자 하나, 그걸 위해 뭐가 필요한가?
앞의 글에서 든 예는, "내가 지정하는 이미지들이, 폭이 넓은 이미지가 640x480보다 크면, 그 크기를 640x480으로 조정하고, 위 아래로 길쭉한 이미지가 폭이 640보다 넓으면 640x??? 사이즈로 바꾼다. 더 작은 이미지는 그냥 내버려 둔다." 이다.

그 다음은 이것이 어떻게 실제로 이루어질지 생각해본다.
먼저 1. "내가 지정하는 이미지"가 어떤 것들인지 파악하고,
2. 그것들 각각의 이미지 사이즈를 알아낸다.
3. 이미지 사이즈를 주어진 요건에 비춰 판단한다.
4. 판단에 따라 적절한 작업을 수행한다.

이정도면 됐을까? 조금 더 나눠보자. 말했든 컴퓨터는 아주 아주 바부탱이다. 빠르기만 열나 빠르지, 0이야? 1이야? 이거 밖에 할 줄 모른다. 조금 더 자세히 할 일을 말해주자.

1. 내가 지정하는 이미지들이 어떤 것인지 따로 적어놓고,
1-1. 그런 이미지들 중 일단 하나를 선택한다.
2. 그 한 이미지의 사이즈를 알아낸다.
3. 이미지의 폭이 기준(640)보다 큰가 작은가
3-1. 작다면 그냥 내버려둔다. 더 할게 없다. 일단 이 이미지에 대해서는 끝.
3-2. 크다면, 그게 넓쭉한가 길쭉한가?
3-2-1. 넓쭉하다면, 그것의 크기는 640x480이 되어야 한다.
3-2-2. 길쭉하다면, 폭은 640이고,
  길이는 원래 길이가 A, 폭이 B 였다면, A : B = 새 길이 : 640 이 되어야 하니깐, 새 길이는 ( A 곱하기 640 ) 나누기 B이다.
4. 이 이미지의 크기를 계산한대로 조정한다. 이 이미지에 대해서 더 할게 없다. 끝.
5. 이제 이 이미지는 됐다. 다음 이미지를 불러오자. 1-1로 다시 간다.

쓰고 보니 그렇게 쉬운 예를 고른 건 아니라는 생각이 든다. 벌써 이 블로그를 떠나려는 마우스의 움직임이 그려진다.
잘못했어요. 미안. 가지 마세요 -_-


어쨌든 프로그램을 짠다는 것은 이렇게 컴퓨터의 동작 방식을 이해하고, 내가 원하는 작업이 실제로 어떤 세부적인 과정을 통해 이뤄지는지 파악한 다음, 그걸 컴퓨터가 알아들을 수 있는 언어로 번역해주는 작업이다.
지금까지 한 것이 바로 "사람이 이해할 수 있는 수준에서 작업을 세부 과정으로 쪼갠" 것이다.

하지만 모든 프로그램이 사실 이렇게 만들어지진 않는다. 아주 간단한 프로그램의 경우는, 무작정 컴퓨터와 직접 소통을 시도하며 쉬운 것부터 시키고, 점차 조금씩 많은 걸 시켜가면서 내가 원하는 것이 점점 반영되도록 계속 수정해서 만들기도 한다. 예를 들면, 일단 스크립트 파일을 하나 만들어 놓고, 거기에 한 두줄만 써넣는다. 내 욕망을 한번에 다 쏟아내는게 아니라 작은 것부터 하나씩 점차 이뤄지도록 한다. 단순한 작업을 하는 스크립트에서 출발해 점점 많은 일을 하고, 많은 것을 고려하는 똑똑한 스크립트로 발전시켜나가는 것이다.

일단 내가 처할 상황을 단순화한다. 보통 내가 디카로 사진을 찍을때 1600 x 1200 이상으로 찍으니 길쭉 넓쭉한 건 있어도 어쨌든 640x480보단 다 클것이다. 다른 경우에 쓸 일이 있으나 일단은 이런 경우를 가정한다. 그리고 이미지는 JPG, GIF등은 말고, PNG만 고치기로 한다.

먼저, 디렉토리를 따로 만들어 길쭉한 사진은 빼놓고(수동), 스크립트가 다음 작업만 하게 한다.
1. 내가 지정하는 이미지들이 어떤 것인지 알아차리고,
2. 다음 과정을 반복한다.
  - 이미지를 하나씩 선택한다. 모두 처리했다면 반복을 끝낸다.
  - 선택한 이미지의 크기를 640x480으로 조정한다.

코드로 옮겨본다. (일단은 그냥 편하게 보자) 파일 이름은 img_resize 정도로 하자. 그냥 텍스트 파일로 만들면 된다. 실행방법은 나중에.

#! /bin/bash
convert -resize 640x480 *.png

이렇게 한(두)줄 스크립트도 충분히 우리를 행복하게 할 수 있는데, "지금 디렉토리의 모든 PNG파일을 640x480크기로 바꿔라"는 말을 "convert -resize 640x480 *.png"라고 타이핑하다가, 이제는 "img_resize"라고 10글자만 타이핑해도 되니까. 스크립트가 별개 아니다. 평소에 복잡하고 긴 명령어를 매번 타이핑해주고 있다면 그냥 이렇게 텍스트 파일에 써놓고 앞으로 그 파일 이름만 타이핑하자. 그것만으로도 우리의 스트레스는 급감한다. 타이핑 양도 줄고, 오타도 줄고, 신경쓸 일도 준다.


이것과 정확히 같은 역할을 하는 코드인데, 앞으로를 위해 "반복 제어문"을 넣은 형태로 바꾸자.

#! /bin/bash
모든 PNG파일중 하나씩 선택해서
   convert -resize 640x480 선택한파일
한다.

컴퓨터가 알아들을 수 있게 바꾸면,

#! /bin/bash
for img in *.png
do
    convert -resize 640x480 $img
done

그냥, for... 문이 반복문인데, 반복할 명령어를 do ~ done 으로 묶어주는구나. 정도 이해해주고 패스.


그래놓고, 이게 잘 되면 조금씩 기능을 추가해간다.
1. 내가 지정하는 이미지들이 어떤 것인지 따로 적어놓고,
2. 다음 과정을 반복한다.
  - 처리 안한 이미지를 하나 선택한다. 모두 처리했다면 반복을 끝낸다.
  * 이미지 폭이 640 보다 큰지 작은지 판단한다.
  **  작으면, 할게 없다.
  **  크면, 선택한 이미지의 크기를 640x480으로 조정한다.


자, 코드는 아래처럼 변해야 한다.

#! /bin/bash
for img in *.png
do
    이미지 폭을 계산한다.
    이미지 폭이 640보다 크면,
         convert -resize 640x480 *.png
    한다
done

자, 사람의 말을 컴퓨터의 말로 바꾸자.
여기서는 아래 코드를 복사&붙여넣기(Copy&Paste)하기로 한다. 골치아프니 일단 생각하지 말고.
  imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    이미지 폭이 640보다 크면
         convert -resize 640x480 *.png
    한다.
done

나머지 부분도 바꿔보자. bash 쉘(리눅스에서 기본으로 사용하는 CUI) 스크립트에서 판단은 if... 를 사용한다.

if [ 조건 ]; then
   할일.
fi

이래놓으면, "조건"이 참일때 "할일"을 수행한다. 본래 코드에 적용

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    if [ 이미지 폭이 640보다 크다 ]; then
         convert -resize 640x480 *.png
    fi
done

이젠, 조건에 해당하는 부분을 컴퓨터말로 바꾸자. "~보다 크다"는 "-gt"를 사용한다.
이미지폭은 바로 윗줄에서 계산해서 imgwidth 라는 곳에 값을 적어놨다. "$"를 붙여 $imgwidth 라고 하면 거기에 적힌 값을 사용할 수 있다.
=> $imgwidth -gt 640

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         convert -resize 640x480 *.png
    fi
done

여기까지 잘 되면, 또 기능을 추가한다. To be continue...
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크
2007/07/13 20:50 2007/07/13 20:50
Trackback Address :: http://blog.jinbo.net/h2dj/trackback/476
Tracked from | 2007/07/13 22:13 | DEL
자, 2편에서 우리는 img_resize 라는 스크립트를 만들었다. 이걸 좀 더 우리의 욕망을 충실히 담도록 진보시키자. 하지만 그전에, 도대체 우리가 뭘 하고 있는지 실제로 확인해야 좀 더 신이 날 것 같다. 저렇게 만든 스크립트를 어떻게 실행하고, 활용할지 보자. 우선, 리눅스는 보안을 위해 적절한 권한이 없으면 말을 안듣는다. img_resize 가 실행하려면 먼저 이 파일에 "실행권한"을 줘야 한다. 그냥 여기서 이해하던 못하던
su 2007/07/15 19:01 URL EDIT REPLY
안녕하세요. 올블타고 왔어요. 히히,
지각생 2007/07/16 13:01 URL EDIT REPLY
어라? 추천받았네 ^^;;
Name
Password
Homepage
Secret

스크립트 만들어 게을리 살자 (1)

매뉴얼
리눅스가 아무리 쓰기 쉬워져도 "어렵다"고 느끼게 되는 건 어쩔 수 없나보다.
아무래도 윈도우 쓰는 사람이 한국에 워낙 많고, 처음에 그걸로 시작하고 자연스럽게 뇌리에 박히게 되니
지금까지는 윈도우에서 하는 걸 리눅스에서도 할 수 있다. 이런 식으로 많이 얘기하게 됐다.

그래봤자 결국 윈도우가 만들어 놓은 패턴에 리눅스가 끌려가는 꼴이 될뿐. 그렇게 해서는 당장 사람들을 끌어들일 수는 있어도 곧 부딪치게 되는 크고 작은 낯선 상황에 다시 윈도우로 돌아가는 걸 막을 수는 없다. 리눅스를 쓰면 뭐가 좋은지, 리눅스만의 독특한게 뭐가 있는지 이런 걸 많이 얘기할 수 있으면 좋겠다.

이런 생각은 했지만 그 동안 내 스스로 그런 걸 많이 뽑아 놓진 않았는데, 최근에 활용한 것 중 생각나는 걸 얘기해보면, imagemagick 프로그램을 이용해 한방 명령으로 이미지 파일을 조작하는게 있었다. 보통 GUI(마우스로 클릭해서 머든지 다하는 방식)이 CUI(명령을 타이핑하는 방식)보다 뛰어난 거라고 생각하지만, 컴퓨터에 익숙해지면 질수록 GUI보다 CUI가 편하고 강력하다.

유닉스 시스템의 철학은 "작고, 단순하게" 만드는 것이다. 그리고 그것들이 유연하게 작동해서, 서로 긴밀하게 결합하는게 특징이다. 그래서 프로그램 하나 하나는 단순한 기능만 갖고 있는 듯하지만, 그것들을 조금만 주루룩 연결해보면, 왠만한 거대한 프로그램이 하는 것을 넘는 일들을 해낸다. 그런 거대한 프로그램들은 유연하지 못해서, 나머지 부분은 사람이 다 직접 삽질로 보충해줘야하지만, 유닉스 시스템의 작은 프로그램들은 적절히 옵션을 사용하고, 결과값을 서로에게 잘 전달하면 얼마든지 그런 빈 곳을 채워갈 수 있다.

예로, imagemagick 프로그램 패키지의 "convert"라는 명령어를 활용하면, 우리가 포로샵을 열고 클릭 클릭 클릭 클릭... 해서 할 일을, 옵션을 포함한 한 줄의 명령어로 처리할 수 있다. 이미지 크기를 바꾸는 작업을 생각해 보자.

$ convert -resize 640x480 *.png

이 명령어는 지금 디렉토리에 있는 모든 PNG 이미지 파일들을(*.png) convert 하는데, 뭘 하냐면 크기를 조정한다 (-resize). 그 크기는 640x480이다. 라는 말이다. 저 한줄이 생소해 보이겠지만 몇번 보다보면 전혀 "이해할 수 없는" 어려운 것은 아닐것.

이런 명령어가 뭐가 좋을지 생각해보자.
난 포로샵은 잘 못 다루고 김프(GIMP)라는 리눅스용 프로그램도 썩 잘 다루는 건 아니다. 그래서 단축키도 잘 몰라서 일일히 클릭클릭, 쭈~우욱 끌고, 다시 클릭 클릭 이런 식으로 작업을 해야하는데, 이게 한 두장이면 몰라도 열장 이상의 이미지를 고치려면 짜증이 이만저만이 아니다. 아무리 편리한 GUI프로그램도 고칠 이미지 숫자가 늘어나면 마찬가지의 반복 삽질. 처음 몇번은 재밌는 작업일 수 있지만 계속 반복해서 같은 걸 하는건, 내가 기계인지 사람인지 알 수 없고, 창의적인 활동을 하고 있다는 생각도 안난다. 웩. 그냥 짧게 말해 "지겨워진다"!

자, 백장의 이미지 크기를 변경해야 한다고 하자. 어떻게 할 것인가? 내가 알기로 어떤 프로그램도 "지금 디렉토리에 있는 모든 특정한 규칙을 갖는 파일들의 크기를 얼마로 한꺼번에 바꿔주라"라는 내 뜻을 알아서 이해하고 처리해주진 못한다. (혹시 그런게 있으면 알려주삼). 난 이미지 갯수만큼 반복해서, 한 이미지의 크기를 변경하는 작업을 계속 해줘야 한다. 이걸 백번 할 수 있을까? 이게 과연 컴퓨터가 인간을 편리하게 한건가 아니면 괜히 전에는 생각도 안하던걸 하게 돼서 더 피곤해진 건가? 하지만 리눅스를 쓰고 있다면 이런 일은 껌도 아니다.

$ convert -resize 640x480 *.png

이 명령어 한번 쳐 주고, 그냥 기다리면 그뿐이니까. 그 동안에 만화 한컷을 더보고, 블로그 한 줄을 더 보고, 음악에 귀기울이고, 재미난 일 하나를 더 떠올리며 웃을 수 있다. 컴퓨터는 이래야 되는거 아닌가?

이야~ 좋네. 하지만 생각해보니 뭔가 부족한게 있다. 위의 명령어는 대상 이미지가 모두 폭이 넓은 경우를 생각하고 있고, 이미지 크기가 640x480 보다 작은 경우는 크기를 키운다. 그런데 내가 정말로 원하는 것은, "폭이 넓은 이미지가 640x480보다 크면, 그 크기를 640x480으로 조정하고, 위 아래로 길쭉한 이미지가 폭이 640보다 넓으면 640x??? 사이즈로 바꾸는 것"이다. 더 작은 이미지는 그냥 내버려 두기로 한다.

너무 많은 걸 바라나? 역시 편해지면 질수록 인간은 게을러진다. 하지만 게으른 인간이 세상을 좋게 만든다. 부지런한 인간은 그냥 자기 스스로 뭐든 해버리니 세상을 굳이 바꿀 필요가 없다. 그러니 더 게을러지자. 위의 복잡한 인간의 욕구는 역시 한번의 명령으로 처리되게 할 수 있다. 어떻게? 사실은 여러 명령어를 쳐야 되는데, 그런 명령어들을 묶어 하나의 명령어로 만드는 방법이 있으니 그게 바로 "쉘 스크립트"짜기. 스크립트를 짜면, 복잡한 명령의 조합을 새로운 나만의 명령어로 만들어 두고, 나중에 계속 다시 활용할 수 있다. 잠깐 건너뛰어서, 위의 욕구 - "폭이 넓은..." 을 수행해주는 명령어를 img_resize 라는 이름의 스크립트 파일로 만들어 두었다고 하자. 그러면 내일이고, 다음달이고, 내년이고 언제든지, 또 다시 그런 작업을 해야할때, 명령행에

$ img_resize 640x480 *.png

이런 식으로 치면 모두 끝이 나버린다. 어떤가요? 삶이 참 아름다워지지 않나요? 한번 삽질해서 스크립트를 만들어두면, 이제는 그 반복노동으로부터 자유로워진다.

그럼, 이런 스크립트를 어떻게 만들 수 있을까? 길어졌으니 다음편에.

ps. 그러고 보니 노조에 일이 있군요. 밤 늦게 이어서. -_-
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크
2007/07/12 20:01 2007/07/12 20:01
Trackback Address :: http://blog.jinbo.net/h2dj/trackback/475
Tracked from | 2007/09/10 19:59 | DEL
지각생님의 [스크립트 만들어 게을리 살자 (1)] 에 관련된 글. 게으르게 사는 짤막 팁.지난달에 썼어야 했던 지각 원고를 쓰고 있는데, 화면 캡처를 위해 vmware 가상머신으로 리눅스를 돌려 캡처를 했지요. 그냥 다른 프로그램 안쓰고 "Print Screen"키를 누른 후 윈더우 그림판에서 붙여 넣는 식으로 했습니다. 그리고 이제 원하는 부분만 잘라야 하는데 하다보니 아 이게 슬슬 지겨워 집니다. 이게 캡처된 이미지. 제가 원하는
로이 2007/07/13 00:07 URL EDIT REPLY
스크립트는 재산과도 같죠..ㅋㅋ
지각생 2007/07/13 00:59 URL EDIT REPLY
재산 공유합시다 :)
달군 2007/07/13 13:14 URL EDIT REPLY
오 멋진데!
지각생 2007/07/13 19:41 URL EDIT REPLY
ㅎㅎ 바로 2편 쓰기 시작~
Name
Password
Homepage
Secret