AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1036325
Accepted
noway
noway
Asked: 2020-10-05 02:48:14 +0800 CST2020-10-05 02:48:14 +0800 CST 2020-10-05 02:48:14 +0800 CST

将文件名中的 MacCyrillic 编码转换为 NTFS 文件系统上的 IBM866

  • 772

通过 samba 将文件从 MacOS 系统复制到 Windows 共享后,我得到的文件名如下:

Сђ•вл
К†в†ЂЃ¶≠л• Ђ®бвл.pdf
П†бѓЃав.doc

通常它们应该看起来像:

Сметы
Каталожные листы.pdf
Паспорт.doc

在某些情况下,我还在名称末尾得到 U+F028 符号:

Новые

有没有办法在 Windows 机器上自动确定和转换此类文件?

file-transfer encoding
  • 1 1 个回答
  • 125 Views

1 个回答

  • Voted
  1. Best Answer
    noway
    2020-10-09T09:34:25+08:002020-10-09T09:34:25+08:00

    我最终编写了自己的脚本......
    代码很糟糕并且没有经过太多测试,但适用于我的情况。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    """
    (Not) Simple MacCyrillic -> IBM866 converting script.
    """
    
    import sys
    if sys.version_info.major == 2:
        print("Please run it with Python 3.4 or better.")
        exit()
    
    import os
    if os.name != 'posix':
        print("This script works only on GNU/Linux.")
        exit(1)
    
    import subprocess
    
    BadChars = ['©', '•', '≠', '£', '¢', '†', 'ѓ', 'Ѓ', 'Ђ', '§', '¶', 'ђ', '®', '°', 'Ґ']
    
    replaceTable = {
                '©': 'й', 
                'ж': 'ц',
                'г': 'у',
                '™': 'к',
                '•': 'е',
                '≠': 'н',
                '£': 'г',
                'и': 'ш',
                'й': 'щ',
                'І': 'з',
                'е': 'х',
                'к': 'ъ',
                'д': 'ф',
                'л': 'ы',
                '¢': 'в',
                '†': 'а',
                'ѓ': 'п',
                'а': 'р',
                'Ѓ': 'о',
                'Ђ': 'л',
                '§': 'д',
                '¶': 'ж',
                'н': 'э',
                'п': 'я',
                'з': 'ч',
                'б': 'с',
                'ђ': 'м',
                '®': 'и',
                'в': 'т',
                'м': 'ь',
                '°': 'б',
                'о': 'ю',
                'Ґ': 'в'
                }
    
    def check_all_path_string(path, BadChars):
        for symbol in BadChars:
            if symbol in path:
                return True 
        return False
    
    def check_part_of_name(part_of_name, BadChars):
        for letter in part_of_name:
            if letter in BadChars:
                return True
        
        return False
    
    def replace_symbols(part_of_name, replaceTable):
        changed_part_of_name = ""
    
        for sym in part_of_name:
            if sym in list(replaceTable.keys()):
                changed_part_of_name += replaceTable[sym]
            else:
                changed_part_of_name += sym
        
        return changed_part_of_name
                
    def check_part_of_bad_path(bad_file_name_list, BadChars, replaceTable):
        replaced_path = ""
        for part_of_name in bad_file_name_list:
            if not check_part_of_name(part_of_name, BadChars):
                replaced_path += "/" + part_of_name
            else:
                replaced_part_of_name = replace_symbols(part_of_name, replaceTable)
                replaced_path += "/" + replaced_part_of_name
        
        if "//" in replaced_path:
            replaced_path = replaced_path.replace("//", "/")
    
        return replaced_path
    
    def main_validation(files, BadChars, replaceTable):
        validated_list = []
    
        for file_name in files:
            if check_all_path_string(file_name, BadChars):
                bad_file_name = file_name
                bad_file_name_list = bad_file_name.split("/")
    
                replaced_path = check_part_of_bad_path(bad_file_name_list, 
                                                        BadChars, 
                                                        replaceTable)
                validated_list.append(replaced_path)
            
            else:
    
                validated_list.append(file_name)
    
        return validated_list
    
    def grab_files(folder, find_type):
        files = subprocess.run(["find", folder, "-type", find_type], stdout=subprocess.PIPE).stdout.decode('utf-8')
        files = files.splitlines()
    
        return files
    
    if __name__ == "__main__":
        folder = os.getcwd()
        find_type = "d" # 'd' for directories or 'f' for files
        print("Grab files from", folder)
        files = grab_files(folder, find_type)
        print("Starting validation...")
        validated = main_validation(files, BadChars, replaceTable)
        print("Computing diff... (this can take a long time)")
        files_diff = [elem for elem in files if elem not in validated ]
        validated_diff = [elem for elem in validated if elem not in files ]
    
        print("Overall source count:", len(files))
        print("Validated diff:", len(validated_diff))
    
        i = 0
        while i < len(validated_diff):
            print(files_diff[i], '->', validated_diff[i])
            i = i + 1
        
        print("\nProceed?")
        choice = input("[Y]es | [N]o > ")
        if choice == 'y' or choice == 'Y':
            i = 0
            while i < len(validated_diff):
                source = '"' + files_diff[i] + '"'
                dest = '"' + validated_diff[i] + '"'
                os.system('mv -i ' + source + ' ' + dest)
                i = i + 1
        elif choice == 'n' or choice == 'N':
            print("Sure, it's okay. Thanks for playing!")
            exit()
        else:
            print("Sorry, I don't understand you.")
            print("Assuming as negative, exiting...")
            exit()
        
    
    • 0

相关问题

  • 在 NFS 文件服务器上获取不规则时间戳

  • 在本地复制大型目录树?cp还是rsync?

  • 服务器 2008 到 2003 使用 cifs 进行慢速文件传输

  • 在Linux服务器之间快速传输文件的最简单方法?

  • 寻找一种更快的方式将文件传输到 Windows 网络共享

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve