'쉘스크립트'에 해당되는 글 8건

  1. 2008.02.20 Mplayer로 workspace이동하기 2
  2. 2008.02.14 [쉘스크립트]자막파일 이름 안바꾸고 애니보기 4
  3. 2008.02.13 [쉘스크립트] 압축해제(tar,zip,rar) 4

Mplayer로 workspace이동하기

제목은 낚을려고한 반쯤은..........풰이크고.
사실은 mplayer의 파이프에 대해서...

뭐 이런거 없어도 그냥 워크스페이스 이동으로만으로 사라지게 할수 있습니다만..
그것도 아니면 아예 종료해버리던가요 (mplayer에서는 q를 누르면 종료가 되죠..)
하지만 그것을 막기 위해서 아래의 스크립트를 사용하는 겁니다..
긴급상황을 넘긴후에는 나머지 동영상을 끝까지 즐기세요!(뭔가 이상해..)

준비물 fluxbox,mplayer
뭐 fluxbox 가 없다하여도.... 대부분의 윈도메니져가 비슷한 기능을 제공할겁니다 그건 알아서 하시고..
전 일단 플빡을 쓰므로 플빡을 기준으로 하겠습니다..
미리 말하지만, 오타는 좀 이해를..
그리고 스크립트는 진짜 간단합니다 몇줄안되죠!

중요한것은 MPLAYER가 PIPE 입력을 지원한다는 점입니다..
시실 이거 하나만 알면 됩니다.. 아랬건 별 필요가 없어요..
DBUS 같은걸로 할줄 알았는데 아니네요,, 다행이어라..

~/.bashrc
 
# export 안하려면 일일히 경로를 지정해 주세요.
export MPLAYER_PIPE_PATH=/tmp/mplayer_pipe

function mp()
{
    if [ ! -e "$MPLAYER_PIPE_PATH" ];then
       mkfifo "$MPLAYER_PIPE_PATH"
    fi

    # -input file=.. 이걸로 파이프 경로를 적어줍니다..
    mplayer -channels 6 -input file="$MPLAYER_PIPE_PATH" "$@"
}

파이프에 메세지를 전달합니다.. 자세한 내용(옵션애 대한) 것은
구글에서 mplayer slave라고 검색하면 좀 나옵니다.
~/bin/screen_hide.sh

# 없앨수도 있을까나..
mplayer_pid=`pgrep mplayer`

if [ "$mplayer_pid" !- "" ];then
    echo "pause" > "$MPLAYER_PIPE_PATH"
fi

이건 플빡전용이라.. 플빡 쓰시는분 아니면 별 신경안써도 되실듯.. 물론 workspace는 2개이상이여야 하겠죠..
대충 내용을 설명하자면 MacroCmd라는건 {A} {B} {C} 이런식으로 명령을 주어진대로 실행하는 겁니다.
여기서는 alt_R 키를 누르면 해당 스크립트를 실행후에 workspace를 딴대로 돌려버리는거죠.
~/.fluxbox/keys

Alt_R :MacroCmd {Exec /home/$USER/bin/screen_hide.sh} {NextWorkSpace}

이러면 오른쪽 alt키로 "긴급한 순간" 에 화면을 확 돌려버릴수 있습니다..
동영상은 그대로 멈춤채로요.(이게 중요함!)
윈도에서 XXX 같은 프로그램보다 화면이동이 빨라서.. 순발력만 뛰어나면 잘 감출수 있을겁니다.

이걸 조금만 응용한다면 외부에서 현재 실행중인 mplayer의 정보를알수도 있으며
접근(멈춤이라던가) 도 가능합니다..

뭐...................... 이거 특별히 포스팅할거리는 아닌거 같지만..
글안올리는거 같기도하고 mplayer slave에 대한 것도 없길래 걍 함 올려보는 겁니다..

추가>
1, 구글링 무섭네연.. 십분바께 안됬는데 봇떠서 내페이지 맨위에 올라있는 후덜덜.
2 저 스크립트에 버그좀 있는데................ 에이 몰라연 알아서 고치셈.

[쉘스크립트]자막파일 이름 안바꾸고 애니보기


 한  보름정도 써봤는데 제대로 작동 잘  하는거 같군요..

그래서 한번 소스 올려봅니다..

간단히 소게 하자면

1 지정된디렉토리로 이동해서 영상파일을 헤더랑 테일 짜른거 보여준후에

2 숫자로 선택하게 하는겁니다

3 옵션으로 찾는 숫자에 해당하는 압축파일을 보여준뒤에 압축풀고

4 나온 smi파일을 파싱해서

5 그걸 동영상파일이랑 이름만 같게한후 자동으로 mplayer로 틀어주는 역활을 합니다..

일단 "작동하는데만" 신경을 썻기 때문에 버그가 꽤 많을겁니다..

주석으로 대충 적어놨는데 몇개 더 있을지도 모르겠네요..

이거 덕분에 애니보기도 쉬워졌네요 일일이

1 영상파일 복사 -> smi압축파일 해제 -> smi 이름바꾸기 -> 동영상 플레이 할필요가 없어졌네요 하핫..

지금 소스 자체가 너무 허술한데.. 뭐 그래도 작동은 제대로 하니깐 잘 봐줘요..

사용법은> 프로그램이름 07
이런식으로 뒤에 '화' 수만 적어주면 됩니다..
<
cd "$HOME/ani" 은 알아서 수정해 주세요>
#!/bin/bash

# VERSION 0.01
# ------------ 추가할것들 ----------------
# Get_Subtitle
# 1,모든 필드를 얻는다 해당 숫자가 포함된것만 자막을 검색하게 추가할것
# 일단 다 만들고 출력은 따로 한다
# (파일이 하나일경우 걍 안보여주고 하려고함)
# 2,선택되지 않는 파일은 루프를 돌려서 삭제한다
# 한 압축파일에 여러 smi들이 있을때 유용
# 근데 이렇게 파려면 모든 데이터를 배열에 넣어야 되는데..;
#
# Get_Filename
# $1중에 없다면 아예 출력을 말게 해야되 <-이거할것 꼭 필요한건 아니지만..
#
# 기타
# 입력받을때 에러 확인할것! (전담함수 추가 바람)
# argument 가능하게 할까?

SUBTUTILE_SUFFIX="smi"
FILE_EXT="$HOME/bin/file_extracter.sh"

cd "$HOME/ani"

if [ $# -ne 1 ];then
echo "Useage: $0 search_file"
exit
fi

function Run_Program()
{
mplayer "$movie_filename" >/dev/null 2>/dev/null &
}

function Clear_Screen()
{
# 지극히 개인적인 옵션 지우고 싶으면 지우셈
clear
echo -e "\n\n\n\n\n"
}

function Get_Subtitle()
{
local cnt=1
local array_cnt=0
local num=1
declare -a array

# fe 내 전용 압축해제 스크립트)
set $($FILE_EXT "$1" | grep -i .smi)

while [ $# -gt 0 ];do
if [ $cnt -gt 1 ];then
string="$string $1"
case "$1" in
*.smi | *.SMI )
# 첫번째 공백제거 (여기서부터가 진정한 데이터)
echo "$(($array_cnt + 1)) - "${string:1}""
array[$array_cnt]="${string:1}"
((array_cnt++))
((cnt=0))
string=""
esac
fi
((cnt++))
shift
done

# 만약 파일이 하나라면 그냥 물어보지 말고 바로 리턴
if [ $array_cnt -eq 1 ];then
ret=${array[0]}
return
else
echo -n "choice number :";read num
fi

ret=${array[$num-1]}
}

# 문자열을 받으면 [],(),{} 사이의 문자를 없애주는 함수
# 이것은 오직 출력할때만 쓰여야만 한다
function Delete_Bracket()
{
# 확장자 백업
local subfix="${1##*.}"
# 확장자 제거 (head,tail 검사위해서)
ret="${1%.*}"
# head 재거
ret=${ret#\[*\]}
ret=${ret#\(*\)}
# tail 제거
ret=${ret%\[*\]}
ret=${ret%\(*\)}
ret="${ret} ----- $subfix"
}

function Get_Filename()
{
local i=0
local loop_filename=""
local num=1
declare -a file_array

for loop_filename in ''$1''
do
Delete_Bracket "$loop_filename"
case "$ret" in
*"$2"* )
echo $(($i+1)) - "$ret"
file_array[$i]="$loop_filename"
((i++))
esac
done
echo -n "choice number :";read num
ret=${file_array[$num-1]}
}

# MAIN
# 깨끗히 하고 시작
Clear_Screen

# 동영상파일과 자막파일을 선택하게 하고 변수에 저장
Get_Filename "*$1*.avi *$1*.mkv *$1*.wmv" "$1"
movie_filename="$ret"
subtitle_filename="${movie_filename%.*}.$SUBTUTILE_SUFFIX"

# 자막파일이 있으면 실행하고 걍 스크립트 종료
if [ -f "$subtitle_filename" ];then
Clear_Screen
Run_Program
exit
fi

# $1의 조건에 해당되는 압축파일(zip,rar) 을 출력하고 선택하게 한다
Get_Filename "*$1*.zip *$1*.rar" "$1"
comp_filename="$ret"

# 압축을 푼다
Get_Subtitle "$comp_filename" "$1"
comp_subtitle_filename="$ret"

# 선택된.smi 파일을 동영상.smi로 이름을 바꾼다
mv "$comp_subtitle_filename" "$subtitle_filename"

# 이제 애니보자!
Clear_Screen
Run_Program

#프로그램 종료전 전에 있던 디렉토리로 재이동
cd $OLDPWD

몇일동안 쉘스크립트 건드리면서 느끼는건데 어지간한건 C 안쓰고 걍 쉘스크립트로 다 해결가능한거 같군요..

정규식이랑 같이 쓰면 파싱하기도 쉽고 (뭐 C언에어서도 파싱라이브러리가 있긴하지만..)
조금만 미리 쓰면 쉘스크립트에서 "신비로 자동 다운로더!" 이런것도 만들수 있을거 같습니다..

해당클럽/자료실에서 자동으로 검색할 문자열이 포함된 것들을 추려서 자동으로 다운로드하게...

[쉘스크립트] 압축해제(tar,zip,rar)

이건 몇달 전부터 만들어 쓰던건데..

그냥 개삽질해서 확장자를 얻어내는거라 상당히 소스가 더럽습니다 -_-

지금 고칠려면 더 잘고칠수 있긴한데 안그래도 뭐 잘 동작하는데.. 하고 걍 방치중입니다...;;


바로 위에 소스가 이게 필요하기 때문에 같이 올립니다..

사용법 > 파일이름(저 소스파일)  압축파일
         파일이름(저 소스파일)  압축파일 압축을풀위치

#!/bin/bash

# 지원하는 파일들은 다음과 같습니다
# zip,alz,rar,tar.gz,tar,tar.bz2,gz,tgz
# 물론 unalz,unzip,unrar,tar등이 설치되어 있어야 합니다
# (첫번째 인자의)파일의 확장자를 찾아내서 처리합니다..
# 두번째 인자가 없으면 디폴트로 처리
# 만약 두번째 인자가 있으면 두번째 인자의 디렉토리에 압축을 푼다
# 그리고 *.jpg *.gif 파일은 cover 디렉토리를 만든다음에 다 거기다 처박아

# IFS 인자를 백업후 .을 IFS인자로 설정
OLD_IFS=$IFS
IFS='.'

Move_Picture()
{
mkdir cover
mv *.jpg *.gif *.png cover
}

# 첫번째 인자를 변수에 넣고 .을 간격자로한 갯수를 구한다
ARG1=($1)
ARRAY_SIZE=$(expr ${#ARG1[*]} - 1)

if (( $ARRAY_SIZE == -1));then
echo "인자가 부족합니다.."
echo "사용법 : $0 파일명 (압축을 풀)경로"
exit 1
fi

# 파일의 확장자를 정한다 (맨뒤에꺼만 아면 된다
# tar.gz같은경우도 gz면 되기때문에 맨마지막만 검사한다
if [ "${ARG1[$ARRAY_SIZE]}" = "zip" ];then
EXTENSION="zip"
elif [ "${ARG1[$ARRAY_SIZE]}" = "rar" ];then
EXTENSION="rar"
elif [ "${ARG1[$ARRAY_SIZE]}" = "alz" ];then
EXTENSION="alz"
elif [ "${ARG1[$ARRAY_SIZE]}" = "tar" ];then
EXTENSION="tar"
elif [ "${ARG1[$ARRAY_SIZE]}" = "gz" ];then
EXTENSION="gz"
elif [ "${ARG1[$ARRAY_SIZE]}" = "tgz" ];then
EXTENSION="tgz"
elif [ "${ARG1[$ARRAY_SIZE]}" = "bz2" ];then
EXTENSION="bz2"
else
echo "지원되지 않는 압축파일입니다 확장자를 확인해 주세요!"
echo "지원되는 압축파일 : ZIP,RAR,ALZ,TAR,GZ(or tar.gz),BZ2(or tar.bz2)"
exit 1
fi

# IFS를 복원
IFS=$OLDIFS

# IFS를 복원했기때문에 원래 인자들이 대입된다
# 그리고 전체 인자 갯수를 구해서, 압축을 풀
# 장소가 command 에 있는지 검사하고 실행한다
ARG1=($1)
ARG2=($2)
ARG_NUM=$#

# (경로)인자가 존재하지 않는다면
if(($ARG_NUM == 1));then
if [ "$EXTENSION" = "zip" ];then
unzip $ARG1
elif [ "$EXTENSION" = "rar" ];then
unrar e -d $ARG1
elif [ "$EXTENSION" = "alz" ];then
unalz $ARG1
elif [ "$EXTENSION" = "tar" ];then
tar -xvf $ARG1
elif [ "$EXTENSION" = "gz" ];then
tar -xvzf $ARG1
elif [ "$EXTENSION" = "tgz" ];then
tar -xvzf $ARG1
elif [ "$EXTENSION" = "bz2" ];then
tar -xvjf $ARG1
fi
# 존재한다면 경로대로 압축을 해제시킨다
elif(($ARG_NUM == 2));then
if [ "$EXTENSION" = "zip" ];then
unzip $ARG1 -d $ARG2
elif [ "$EXTENSION" = "rar" ];then
mkdir $ARG2
cd $ARG2
unrar x $OLDPWD/$ARG1
Move_Picture
cd $OLDPWD
elif [ "$EXTENSION" = "alz" ];then
unalz $ARG1 $ARG2
elif [ "$EXTENSION" = "tar" ];then
tar -xvf $ARG1 -C $ARG2
elif [ "$EXTENSION" = "gz" ];then
tar -xvzf $ARG1 -C $ARG2
elif [ "$EXTENSION" = "tgz" ];then
tar -xvzf $ARG1 -C $ARG2
elif [ "$EXTENSION" = "bz2" ];then
tar -xvjf $ARG1 -C $ARG2
fi
Move_Picture
fi

prev 1 2 next