perl로 디렉토리명 인코딩 후 변경시 문제점 문의드립니다.
윈도우즈 에서 보낸 파일을 펄로 압축을 푼뒤
자동으로 파일명 디렉토리명을 변경하는 부분을 작성중인데
초보인데다 머리가 너무 딱딱해져
잘 안풀립니다. 도움좀 요청하고자 이렇게 질문합니다.
아래 소스를 참고로 만들고 있는데
이게 처음은 잘 되는데
똑같은 파일을 다시 압축을 풀게되면
똑같은 이름의 파일이 존재하니까 덮어쓰기가 되었으면 좋겠는데
글자가 깨진상태로 새로운 폴더가 만들어지는지
원래 있던 파일이 글자가 깨지고
새로운 폴더가 제대로 이름이 바뀌는지..아직 확인이 잘 안되지만
압축을 푸는만큼 파일이 늘어납니다.
이것저것 라이브러리를 추가해서 되면 좋겠지만
있는것만 가지고 써야되는 환경이라 그것도 어렵고
영어로만되었던 사양에 새로 추가하는거라 언어를 영어로만 한정하는것도 어렵고
그럼 정리해서 질문
1.디렉토리에서 어떤 처리가 추가되어야(삭제나 카피가 아닌)
지금 의 폴더가 이미 존재하는 디렉토리에 덮어쓰기가 될까요?
소스상으로 도움을 주시면 더욱 감사하겠지만
힌트를 던져주셔도 감사히 받겠습니다.
find({ wanted => \&change_file, follow => 1 }, $path);
finddepth({ wanted => \&change_dir, follow => 1 }, $path);
sub change_file {
if ( -f $_ ) {
my $name = $_;
if(Encode::Guess->guess($name) !~ /utf/){
Encode::from_to($name, 'sjis', 'utf8');
rename $_, $name;
}
}
}
sub change_dir {
if ( -d $_ ) {
my $name = $_;
if(Encode::Guess->guess($name) !~ /utf/ && $name !~ /^\./){
Encode::from_to($name, 'sjis', 'utf8');
rename $_, $name;
}
}
}
기본으로 돌아가서 해결
대강 코드를 보니
Windows는 로컬인코딩을 쓰고, 한글 Windows의 경우 cp949
일본 Windows의 경우 위의 소스코드는 일본에서 만든 어떤 코드를 가져온 것으로 보이는데
sjis를 쓰는 것 같군요.
님이 하시는 작업은 일단 윈도우에서 압축된(로컬인코딩의 문자열이 포함된)파일을
리눅스 utf8환경에 풀고(여기까지는 위 코드에 안나오는 부분으로 생각됨)
디렉토리와 파일을 recursive하게 돌아가며 로컬인코딩의 문자열을 utf8으로 변환하는 것 같습니다.
그러면 문제는 명확해 집니다. 로컬인코딩의 문자열을 utf8인코딩의 문자열로
바꿔주면 되는거죠. 위 코드에서는 Encode::Guess->guess($name) !~ /utf/ 로
문자열의 인코딩을 추측하여 utf계열 인코딩이 아니면 무조건 sjis를 utf8로
바꾸도록 되어있습니다.
윈도우즈에 압축된 로컬인코딩은 어느 윈도우즈를 쓰느냐에 따라 명확하게 정해집니다.
따라서 100% 정확함을 장담할 수 없는 Encode::Guess 모듈을 써서 판단할 필요는 없다고
보여집니다. 한글 윈도우즈에서 압축한 파일이면
if(Encode::Guess->guess($name) !~ /utf/){
Encode::from_to($name, 'sjis', 'utf8');
}
는 그냥
Encode::from_to($name,'cp949', 'utf8');
로 쓰시면 될듯 합니다. change_dir에서도 마찬가지고요
아니면 2중 작업 필요없이 http://nightshadow.tistory.com/153 에서 처럼 압축을 풀때
바로 decode함수를 써서 변환해도 됩니다.
답변 감사합니다.
제가 제대로 이해를 했는지 모르겠습니다.
인코딩전의 에이 라는 폴더가 인코딩후에 에에이가 된다고 가정하고
에에이가 이미 존재할경우
에이의 캐릭터를 판단할 필요 없이
위와같은 방법으로
무조건적으로 utf8로 인코딩 또는 디코딩을 하게된다면
덮어쓰기가 가능해진다는 것인지요..
조금 다른 내용인듯 싶습니다만
조언 감사합니다.
흠
파일을 풀때 부터 적절하게 문자열 인코딩을 바꾸고 푸는 옵션에
기존에 파일이 있으면 강제로 덮어쓰도록 하면 위 같은 과정은
따로 필요 없으리라 보입니다.
아하 그런말씀!
여러 뒷배경에대한 설명이 부족했습니다.
압축을 풀때 지정할수 있는 옵션( -o였나요?)이 들어있지 않고
위에 링크에 언급되있는 모듈추가(archivezip)가 불가능한관계로
거기에 그 convmv였던가요?? 그 커맨드가 없기도 합니다.
다시 고민을 해보아야 할것 같습니다.
그럼 감사합니다.
댓글 달기