Rename을 for과 함께쓰면 제대로 작동하지 않습니다

[code:23xwdr9a]#!/bin/bash
IFS=’

for i in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS;
do
rename ‘s/?/\?/g’ "$i"
rename ‘s/:/\:/g’ "$i"
rename ‘s/*/\*/g’ "$i"
rename ‘s/"/\"/g’ "$i"
rename ‘s/*/\*/g’ "$i"
rename ‘s/</\〈/g’ "$i"
rename ‘s/>/\〉/g’ "$i"
rename ‘s/|/\│/g’ "$i"
rename ‘s/[ ]+.([^.]+)$/.$1/’ "$i"
done
exit[/code:23xwdr9a]

rename 명령어를 for 구문과 함께 사용하면, 문제가 발생합니다.
문자가 한 종류의 것만 바뀌고 지정된 다른 문자는 해당 문자가 없을때만 바뀝니다.
인터넷을 뒤져보고, bash 쉘스크립트 가이드를 보았지만 여전히 뭐가 문제인지 모르겠습니다.

rename에 ‘y/?:/?:/’ 란 정규표현식을 사용하면 한개로 쓸때와는 다르게 잘못된 인코딩이라며 치환된 모든 문자가 마름모로 둘러싸인 물음표로만 나타나서 위와 같이 작성했습니다.

정규표현식은 문자단위로 처리합니다.
그런데 이 문자단위라는 개념이 다중바이트 문자들에 대해서는 어려운점이 있습니다.

그리고, y명령은 문자들의 1:1 대치인데…
?M을 ?M으로 바꾸려고 해도 앞의것은 1바이트이고 뒤의것은 2바이트이기 때문에…
문제가 발생합니다.

[code:2py8bd3p]
#!/usr/bin/perl -p
#-p옵션은 표준 입출력을 위한 옵션으로 아래의 코딩 형태와 같음.
#$_=<>
#... 코드 ...
#print;

#샘플문자열
#표준입력에서 읽고자 한자면 $=<> 이렇게 하면 됩니다.
#$
=‘abc.?:*"<>|.def’;

#변환 테이블
$tbl = {
‘?’=> ‘?’,
‘:’=>‘:’,
‘*’=>‘*’,
‘"’=>‘"’,
‘<’=>‘〈’,
‘>’=>‘〉’,
‘|’=>‘│’
};

#변환 테이블의 문자들을 (x|y|z)과 같은 형태의 정규표현식으로 변경
$re="(".join("|",keys $tbl).")";

#일치한 결과에 대하여, 결과값을 열쇠값(key)로 하여, 값을 찾아서 그 값으로 대체
#$+는 (x|y|z)같은 표현식의 일치된 결과를 나타내는 변수
s/$re/$tbl->{$+}/g;

#결과를 출력
#print ;
[/code:2py8bd3p]

어떻게 사용해야 하죠?
->{}는 뭔가요?

[quote="별님":1v886uga]어떻게 사용해야 하죠?
->{}는 뭔가요?[/quote:1v886uga]

perl프로그램이구요…
$tbl은 변환테이블을 가리키는 참조변수(reference)입니다.
->은 C언어와 마찬가지로 그 참조변수의 대상을 말하는것이고,
{}의 내용은 참조대상의 키를 나타낸 것입니다.

$tbl={id=>1,name="kim"}
tbl은 id키에1값, name키에 kim값을 가지는 해시테이블에 대한 레퍼런스가 됩니다.
$tbl->{id} 이것은 그 해시테이블에서 id키에 연결된 값 1이 될 것입니다.

[code:f2ego0us]
#!/usr/bin/perl

#변환 테이블
$tbl = {
‘?’=> ‘?’,
‘&#58;’=>‘:’,
‘*’=>‘*’,
‘&quot;’=>‘"’,
‘&lt;’=>‘〈’,
‘&gt;’=>‘〉’,
‘|’=>‘│’
};

#변환 테이블의 문자들을 (x|y|z)과 같은 형태의 정규표현식으로 변경
$re="(".join("|",keys $tbl).")";

my $src;

#표준입력에서 줄단위로 처리
while(<>) {
#줄바꿈문자를 없앰
chomp;
$src=$;
#일치한 결과에 대하여, 결과값을 열쇠값(key)로 하여, 값을 찾아서 그 값으로 대체
#$+는 (x|y|z)같은 표현식의 일치된 결과를 나타내는 변수
#치환에 성공하면 이름을 변경함
s/$re/$tbl->{"\".$+}/g and rename $src,$
;
}
[/code:f2ego0us]

다음과 같이 변경한 후에…
x.pl로 저장 chmod +x x.pl
find . -type f | x.pl
님의 스크립트의 경우는,
echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"|x.pl

이미 줄단위로 읽어서 이름 변경하게 되어 있기 때문에… for문은 필요 없어요.