سؤال

لدي مجموعة من الملفات مع أسماء الملفات باستخدام جميل السويدية الحروف å å و ö.لأسباب مختلفة أنا الآن في حاجة إلى تحويل هذه إلى [a-zA-Z] مجموعة.فقط إزالة أي شيء خارج هذا النطاق من السهل إلى حد ما.الشيء الذي يسبب لي المتاعب التي كنت ترغب في استبدال å مع a, ö مع o وهلم جرا.

هذا هو charset المشاكل في أسوأ حالاتها.

لدي مجموعة من ملفات الاختبار:

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) 

من غريب الأمر أن إذا قمت بطباعة نتائج هذا (عادي على حلقة هذا هو) في ملف يمكنني الحصول على هذا الناتج:

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

ذلك شيء غريب يحدث لي أسماء حتى قبل أن تصل إلى أدوات أخرى (لقد كنت تحاول أن تفعل هذا باستخدام sed ميناء ويندوز من ما يسمى GnuWin32 ولكن لم الحظ حتى الآن) والقيام محل على هذه الشخصيات لا يساعد أيضا.

كيف يمكن حل هذه المشكلة ؟ أنا منفتح على أي نوع من أدوات سطر الأوامر أو غير ذلك...

تحرير: هذا هو وقت واحد مشكلة ، لذلك أنا أبحث عن quick 'n القبيح إصلاح

هل كانت مفيدة؟

المحلول

يمكنك استخدام هذا الرمز (بايثون)

إعادة تسمية الملفات الدولية

# -*- 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)

###

لديك لتغيير الترميز الخاص بك شار الجداول (أنا اختبرت هذا البرنامج النصي مع الإسبانية الملفات و يعمل بشكل جيد).يمكنك التعليق على "التحرك" خط للتحقق مما إذا كان العمل حسنا ، وإزالة التعليق في وقت لاحق للقيام تسمية.

نصائح أخرى

قد يكون أكثر حظا في cmd.exe إذا كنت فتحه في وضع UNICODE.استخدام "cmd /U".

واقترح آخرون باستخدام لغة البرمجة.لا بأس, لا سيما إذا كان لديك لغة كنت مرتاحا جدا مع.صديقي على C# فريق يقول أن C# 3.0 (مع Linq) مناسبة تماما الجلد سريع, برامج صغيرة مثل هذه.وقد توقفت عن كتابة الملفات الدفعية أكثر من مرة.

شخصيا, وأود أن اختيار PowerShell.يمكن حل هذه المشكلة على سطر الأوامر, و في خط واحد.سوف

تحرير:ليس سطر واحد, ولكن ليس الكثير من التعليمات البرمجية, إما.أيضا, يبدو ستاكوفيرفلوو لا مثل جملة "$_.اسم" و يجعل _ كما _.

$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# أو جافا-بيئات حيث أعلم يقينا أن يمكنك الحصول على أحرف Unicode الخروج من المسار بشكل صحيح.انها دائما غير مؤكد مع أدوات سطر الأوامر ، وخاصة من Cygwin.

ثم رمز بسيط بحث/استبدال أو regex/محل.إذا كان يمكنك تسمية اللغات سيكون من السهل لكتابة التعليمات البرمجية.

أود كتابة vbscript (WSH) إلى فحص الدلائل ، ثم ترسل الملفات إلى الوظيفة التي تتكسر أسماء الملفات في رسائل فردية ، ثم يقوم بتحديد حالة على السويدية منها ويحل لهم مع تلك التي تريد.أو بدلا من أن وظيفة يمكن أن مجرد قطرة من خلال مجموعة من محل() وظائف إسناد الإخراج إلى سلسلة الإدخال.في نهاية الأمر ثم إعادة تسمية الملف مع القيمة الجديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top