문제

나는 사랑스러운 스웨덴 문자를 사용하여 파일 이름을 가진 많은 파일을 가지고 있습니다. å å 그리고 ö.여러 가지 이유로 이제 이를 [a-zA-Z] 범위로 변환해야 합니다.이 범위 밖의 항목을 제거하는 것은 매우 쉽습니다.나에게 문제를 일으키는 것은 교체하고 싶다는 것입니다. å ~와 함께 , ö ~와 함께 영형 등등.

이것은 최악의 문자셋 문제입니다.

테스트 파일 세트가 있습니다.

files\Copy of New Text Documen åäö t.txt
files\fofo.txt
files\New Text Document.txt
files\worstcase åäöÅÄÖéÉ.txt

나는 이 줄을 기반으로 스크립트를 작성하고 그 결과를 다양한 명령에 전달합니다.

for %%X in (files\*.txt) do (echo %%X) 

이상한 점은 이 결과(일반 for 루프)를 파일로 인쇄하면 다음과 같은 결과가 나온다는 것입니다.

files\Copy of New Text Documen †„” t.txt
files\fofo.txt
files\New Text Document.txt
files\worstcase †„”Ž™‚.txt

따라서 파일 이름이 다른 도구에 도달하기도 전에 이상한 일이 발생하고 있습니다(GnuWin32라는 Windows용 sed 포트를 사용하여 이 작업을 시도했지만 지금까지는 운이 없었습니다). 도움이 되거나.

이 문제를 어떻게 해결하시겠습니까?나는 모든 유형의 도구, 명령줄 등을 사용할 수 있습니다…

편집하다: 이것은 일회성 문제이므로 빠르고 보기 흉한 해결책을 찾고 있습니다.

도움이 되었습니까?

해결책

이 코드를 사용할 수 있습니다 (Python)

국제 파일 이름 바꾸기

# -*- coding: cp1252 -*-

import os, shutil

base_dir = "g:\\awk\\"    # Base Directory (includes subdirectories)
char_table_1 = "áéíóúñ"
char_table_2 = "aeioun"

adirs = os.walk (base_dir)

for adir in adirs:
    dir = adir[0] + "\\"          # Directory
    # print "\nDir : " + dir

    for file in adir[2]:    # List of files
        if os.access(dir + file, os.R_OK):
            file2 = file
            for i in range (0, len(char_table_1)):
                file2 = file2.replace (char_table_1[i], char_table_2[i])

            if file2 <> file:
                # Different, rename
                print dir + file, " => ", file2
                shutil.move (dir + file, dir + file2)

###

인코딩과 char 테이블을 변경해야 합니다(스페인어 파일로 이 스크립트를 테스트했는데 잘 작동합니다)."이동" 줄에 주석을 달아 제대로 작동하는지 확인하고 나중에 주석을 제거하여 이름을 바꿀 수 있습니다.

다른 팁

UNICODE 모드에서 cmd.exe를 열면 더 많은 행운을 얻을 수 있습니다."cmd /U"를 사용하세요.

다른 사람들은 실제 프로그래밍 언어를 사용하도록 제안했습니다.괜찮습니다. 특히 매우 편안한 언어를 사용하고 있다면 더욱 그렇습니다.C# 팀에 있는 내 친구는 C# 3.0(Linq 포함)이 이와 같은 빠르고 작은 프로그램을 만드는 데 적합하다고 말합니다.그는 대부분의 시간 동안 배치 파일 작성을 중단했습니다.

개인적으로 저는 PowerShell을 선택하겠습니다.이 문제는 명령줄에서 한 줄로 바로 해결할 수 있습니다.아픈

편집하다:한 줄도 아니고 코드도 많지 않습니다.또한 StackOverflow는 "$_.Name" 구문을 좋아하지 않고 _를 &#95로 렌더링하는 것 같습니다.

$mapping = @{ 
    "å" = "a"
    "ä" = "a"
    "ö" = "o"
}

Get-ChildItem -Recurse . *.txt | Foreach-Object { 
    $newname = $_.Name      
    foreach  ($l in $mapping.Keys) {
        $newname = $newname.Replace( $l, $mapping[$l] )
        $newname = $newname.Replace( $l.ToUpper(), $mapping[$l].ToUpper() )
    }
    Rename-Item -WhatIf $_.FullName $newname    # remove the -WhatIf when you're ready to do it for real.
}

저는 경로에서 유니코드 문자를 적절하게 가져올 수 있다고 확신하는 C++, C# 또는 Java 환경에서 이 글을 작성합니다.특히 Cygwin 외부의 명령줄 도구에서는 항상 불확실합니다.

그런 다음 코드는 간단한 찾기/바꾸기 또는 정규식/바꾸기입니다.언어 이름을 지정할 수 있으면 코드를 작성하기가 쉽습니다.

나는 vbscript(WSH)를 작성하여 디렉토리를 스캔한 다음 파일 이름을 개별 문자로 분리하는 함수에 파일 이름을 보낸 다음 스웨덴어에 대해 SELECT CASE를 수행하고 원하는 이름으로 바꿉니다.또는 그렇게 하는 대신 함수는 여러 REPLACE() 함수를 통해 이를 삭제하고 출력을 입력 문자열에 다시 할당할 수 있습니다.마지막에는 파일 이름을 새 값으로 바꿉니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top