파일명의 불필요한 공백문자, uri coding 등의 불필요한 문자를 제거하는 스크립트

좋은 프로그램, 한글화 파일, 그외 유용한 자료들

Moderator: Dry8r3aD

Post Reply
별님
Posts: 577
Joined: 2012/01/11 Wed 9:38 pm
Contact:

파일명의 불필요한 공백문자, uri coding 등의 불필요한 문자를 제거하는 스크립트

Post by 별님 » 2013/02/27 Wed 9:02 pm

현재폴더에 있는 파일의 이름만 고치기.sh
[code:22hqa88n]#!/bin/bash
#작동시 오류가 있다. 특수기호가 공백문자와 썪여있을 경우 제대로된 처리를 하지 못한다.

{
echo '=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+'
date

IFS='
'

#uri로 escape된 문자를 unescape
ls | xargs -I{} convmv --notest --unescape {}

#파일 이름을 고침
for a in `ls`
do
if [ -f "$a" ]
then #대상이 화일
f=$(basename "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//' -e 's/\s+\.([^\.\s]+)$/.\1/')
else #대상이 화일이 아님
f=$(basename "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//')
fi
mv -Tv "$a" "$f"
done

echo ''
} 2>&1 | tee -a ~/"Log/$(basename "$0").log"

exit[/code:22hqa88n]

파일이름 고치기-현재폴더의 숨겨지지 않은 하위 모든 영역에 적용.sh
[code:22hqa88n]#!/bin/bash
#작동시 오류가 있다. 특수기호가 공백문자와 썪여있을 경우 제대로된 처리를 하지 못한다.

{
echo '=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+'
date

IFS='
'

#작업 대상이 될 위치들을 추출
temp=`find "$(pwd)" -not \( -type d -name ".*" -prune \) -type d`

#역순으로 정렬
last=`echo "$temp" | fgrep -c ''`
countt=$last
for i in `seq $last`
do
temp2=`echo "$temp2"; echo "$temp" | sed -n "${countt}p"`
countt=`expr $countt - 1`
done

#uri로 escape된 문자를 unescape
home=`pwd`
for i in `echo "$temp2" | sed '1d'`
do
cd "$i"
ls | xargs -I{} convmv --notest --unescape {}
done

#변수를 초기화
unset temp2

#작업 대상이 될 위치들을 추출
temp=`find "$(pwd)" -not \( -type d -name ".*" -prune \) -type d`

#역순으로 정렬
last=`echo "$temp" | fgrep -c ''`
countt=$last
for i in `seq $last`
do
temp2=`echo "$temp2"; echo "$temp" | sed -n "${countt}p"`
countt=`expr $countt - 1`
done

#파일 이름을 고침
for i in `echo "$temp2" | sed '1d'`
do
for a in `ls "$i"`
do
if [ -f "$i/$a" ]
then #대상이 화일
f=$(basename "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//' -e 's/\s+\.([^\.\s]+)$/.\1/')
else #대상이 화일이 아님
f=$(basename "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//')
fi
mv -Tv "$i/$a" "$i/$f"
done
done

zenity --info --title '알림' --text '작업이 완료되었습니다.'

echo ''
} 2>&1 | tee -a ~/"Log/$(basename "$0").log"

exit[/code:22hqa88n]

파일명의 개행문자가 있으면 처리하지 않습니다. 쉘에서 하려니, 너무 복잡해지는듯 싶어 그만두었습니다.
개행문자를 제거하는 방법을 알려주시면 추가/수정후 다시 올리겠습니다.

저는 nautilus script에 넣고 사용합니다.

적용하려면, 빈파일을 만드시고 위 코드를 붙여넣은뒤 저장하시고 난뒤 파일을 우클릭->속성->권한에서 '실행: 이 파일을 실행파일로 허용'에 체크해주시면 됩니다. 그 뒤, 터미널을 열고, 해당 스크립트의 주소를 쓰신뒤 엔터를 누르시면 해당 위치에서 적용됩니다.
nautilus script에 적용하시려면, '마우스 우클릭->스크립트->스크립트 폴더 열기'하셔서 스크립트 폴더에 넣어주시면 됩니다. 이 방법을 사용하면 터미널을 열 필요없이 마우스 동작만으로도 쉽고 간단하게 적용됩니다.

별님
Posts: 577
Joined: 2012/01/11 Wed 9:38 pm
Contact:

Re: 파일명의 불필요한 공백문자, uri coding 등의 불필요한 문자를 제거하는 스크립트

Post by 별님 » 2013/03/07 Thu 1:04 am

현재폴더에 있는 파일의 이름만 고치기.sh
[code:2my9jh9d]#!/bin/bash
#작동시 오류가 있다. 메타문자가 공백문자와 썪여있을 경우 제대로된 처리를 하지 못한다.

{
echo '=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+'
date

IFS='
'

#줄바꿈을 제거
find . -maxdepth 1 -exec rename -v 's/\n/\ /g' "{}" \;

#uri로 escape된 문자를 unescape
ls | xargs -I{} convmv --notest --unescape {}

#파일 이름을 고침
for a in `ls`
do
if [ -f "$a" ]
then #대상이 화일
f=$(basename "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//' -e 's/\s+\.([^\.\s]+)$/.\1/')
else #대상이 화일이 아님
f=$(basename "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//')
fi
mv -Tv "$a" "$f"
done

echo ''
} 2>&1 | tee -a ~/"Log_nautilus-scripts/$(basename "$0").log"

exit[/code:2my9jh9d]

하위 모든 영역을 대상으로 파일 이름을 고치기(단, 숨겨진 폴더 아래의 파일들은 제외된다.)
[code:2my9jh9d]#!/bin/bash
#작동시 오류가 있다. 메타문자가 공백문자와 썪여있을 경우 제대로된 처리를 하지 못한다.

{
echo '=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+'
date

IFS='
'

#줄바꿈을 제거
find . -exec rename -v 's/\n/\ /g' "{}" \;

#작업 대상이 될 위치들을 추출
temp=`find "$(pwd)" -not \( -type d -name ".*" -prune \) -type d`

#역순으로 정렬
last=`echo "$temp" | fgrep -c ''`
countt=$last
for i in `seq $last`
do
temp2=`echo "$temp2"; echo "$temp" | sed -n "${countt}p"`
countt=`expr $countt - 1`
done
temp2=$(echo "$temp2" | sed '1d')

#파일 이름을 고침
for i in $temp2
do
cd "$i"

#uri로 escape된 문자를 unescape
ls | xargs -I{} convmv --notest --unescape "{}"

#파일 이름을 고침
for a in `ls`
do
if [ -f "$a" ]
then #대상이 화일
f=$(echo "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//' -e 's/\s+\.([^\.\s]+)$/.\1/')
else #대상이 화일이 아님
f=$(echo "$a" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//')
fi
mv -Tv "$a" "$f"
done

done

zenity --info --title '알림' --text '작업이 완료되었습니다.'

echo ''
} 2>&1 | tee -a ~/"Log_nautilus-scripts/$(basename "$0").log"

exit[/code:2my9jh9d]

스크립트를 보다 간결하게 수정하고, 개행문자도 처리되도록 수정했습니다.
null문자를 구분자로 쓰려 했었지만, 이편이 더 간단하고 보기 좋아서 이대로 둡니다.

저는 nautilus script에 넣고 사용합니다.

용도:
인터넷에서 다운로드한 파일들은 +,_나, 브라우져 자체의 불친절로 인해 uricording된 이름이 uncoding되지 않고 받아지는 경우가 왕왕있습니다. 이외에도, 웹에서 긁어와 붙인 파일명이 이상하다거나, 줄바꿈 문자가 삽입되어 있다거나 앞뒤로 공백문자가 잔뜩 붙어 있어 정렬하기가 난감한 경우가 있습니다. 이 스크립트는 그런 일들을 해결해주어, 파일명을 깔끔하게 만들어줍니다.

설치법?:
적용하려면, 빈파일을 만드시고 위 코드를 붙여넣은뒤 저장하시고 난뒤 파일을 우클릭->속성->권한에서 '실행: 이 파일을 실행파일로 허용'에 체크해주시면 됩니다. 그 뒤, 터미널을 열고, 해당 스크립트의 주소를 쓰신뒤 엔터를 누르시면 해당 위치에서 적용됩니다.
nautilus script에 적용하시려면, '마우스 우클릭->스크립트->스크립트 폴더 열기'하셔서 스크립트 폴더에 넣어주시면 됩니다. 이 방법을 사용하면 터미널을 열 필요없이 마우스 동작만으로도 쉽고 간단하게 적용됩니다.

별님
Posts: 577
Joined: 2012/01/11 Wed 9:38 pm
Contact:

Re: 파일명의 불필요한 공백문자, uri coding 등의 불필요한 문자를 제거하는 스크립트

Post by 별님 » 2013/03/21 Thu 2:38 am

현재 폴더에 있는 파일의 이름만 고치기
[code:2yjtv6ko]#!/bin/bash
: <<\EOF
숨겨진 파일(name : .*)은 대상에서 제외된다.

작업내용:
uri incoding을 decoding
'+', '_'를 제거(스페이스 문자로 치환)
줄바꿈을 제거(스페이스 문자로 치환)
시작과 끝에서의 공백문자를 제거
파일의 확장자 앞의 공백문자를 제거
EOF

{
echo '=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+'
date

IFS='
'

#줄바꿈을 제거
echo -e "\n줄바꿈을 제거합니다."
find . -maxdepth 1 -exec rename -v 's/\n/\ /g' "{}" \;

#파일 이름을 고침
echo -e "\n파일 이름을 고칩니다."; echo "작업위치 : `pwd`";
for a in `ls`
do
f=$(echo "$a" | echo -e "$(sed 's/+/ /g; s/%/\\x/g')" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//') #공통 수정
if [ -f "$a" ] #파일일 경우는 추가 수정
then f=$(echo "$f" | sed -r -e 's/\s+\.([^\.\s]+)$/.\1/')
fi
if [ "$a" != "$f" -a -e "$f" ] #수정될 이름을 가진 대상이 존재하는지 확인
then
erro=$(echo "$erro"; echo "$a") #에러 목록을 작성
elif [ "$a" != "$f" -a ! -e "$f" ]
then
mv -Tv "$a" "$f" #이름을 수정
fi
done

#작업 결과를 알림
if [ "$erro" ]
then
for i in $erro
do
erro_list=`echo -n "${erro_list} \"$i\""`
done
bash <<EOF
zenity --list \
--title "알림" \
--text "수정될 이름을 가진 대상이 존재합니다!" \
--height 400 \
--column '이름' $erro_list
EOF
fi

echo ''
} 2>&1 | tee -a ~/"Log_nautilus-scripts/$(basename "$0").log"

exit[/code:2yjtv6ko]

하위 모든 영역에서 파일 이름을 고치기
[code:2yjtv6ko]#!/bin/bash
: <<\EOF
숨겨진 영역(path : */.*)과 숨겨진 파일(name : .*)은 대상에서 제외된다.

작업내용:
uri incoding을 decoding
'+', '_'를 제거(스페이스 문자로 치환)
줄바꿈을 제거(스페이스 문자로 치환)
시작과 끝에서의 공백문자를 제거
파일의 확장자 앞의 공백문자를 제거
EOF

{
echo '=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+'
date

IFS='
'

#줄바꿈을 제거
echo -e "\n줄바꿈을 제거합니다."
find . -exec rename -v 's/\n/\ /g' "{}" \;

#작업 대상이 될 위치들을 추출
temp=`find . ! \( -path '*/.*' -prune \) -type d`

#현재위치를 기억
home=`pwd`

#역순으로 정렬
last=`echo "$temp" | fgrep -c ''`
countt=$last
for i in `seq $last`
do
temp2=`echo "$temp2"; echo "$temp" | sed -n "${countt}p"`
countt=`expr $countt - 1`
done

#파일 이름을 고침
echo -e "\n파일 이름을 고칩니다."; echo "작업위치 : $home";
for i in $temp2
do
cd "$i" #작업 위치로 이동
echo ''; echo "$i에서"
for a in `ls`
do
f=$(echo "$a" | echo -e "$(sed 's/+/ /g; s/%/\\x/g')" | sed -r -e 's/\+/\ /g' -e 's/_/\ /g' -e 's/^\s+//' -e 's/\s+$//') #공통 수정
if [ -f "$a" ] #파일일 경우는 추가 수정
then f=$(echo "$f" | sed -r -e 's/\s+\.([^\.\s]+)$/.\1/')
fi
if [ "$a" != "$f" -a -e "$f" ] #수정될 이름을 가진 대상이 존재하는지 확인
then
erro=$(echo "$erro"; echo "$i/$a") #에러 목록을 작성
elif [ "$a" != "$f" -a ! -e "$f" ]
then
mv -Tv "$a" "$f" #이름을 수정
fi
done
cd "$home" #초기 위치로 복귀
done

#작업 결과를 알림
if [ "$erro" ]
then
for i in $erro
do
path=$(dirname "$i")
name=$(basename "$i")
erro_list=`echo -n "${erro_list} \"$name\" \"$path\""`
done
bash <<EOF
zenity --list \
--title "알림" \
--text "수정될 이름을 가진 대상이 존재합니다!" \
--height 400 \
--column '이름' \
--column '위치' $erro_list
EOF
else
zenity --info --title '알림' --text '작업이 완료되었습니다.'
fi

echo ''
} 2>&1 | tee -a ~/"Log_nautilus-scripts/$(basename "$0").log"

exit[/code:2yjtv6ko]

마이너 버그 픽스
이미 존재하는 이름이 있을시 파일이 사라지던 문제 해결
작업되지 않은 파일이 존재할시 알리기
속도를 향상
등등...

bash에 적합하도록 만들어졌으나, sh로 수정해도 될겁니다.

Post Reply