在Windows XP上使用国际字符批量重命名文件

在Windows XP上使用国际字符批量重命名文件

Batch renaming of files with international chars on Windows XP

我有一堆使用我们可爱的瑞典字母的文件名吗? ?和?。
由于各种原因,我现在需要将它们转换为[a-zA-Z]范围。只需删除此范围之外的任何内容,都非常容易。引起我麻烦的是我想更换吗?与,?与o等。

这是最糟糕的字符集麻烦。

我有一组测试文件:

1
2
3
4
5
files\\Copy of New Text Documen ??? t.txt
files\\fofo.txt
files\
ew Text Document.txt
files\\worstcase ??????éé.txt

我将脚本基于此行,将其结果传递到各种命令中

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

奇怪的是,如果我将此结果(即普通的for循环)打印到文件中,则会得到以下输出:

1
2
3
4
5
files\\Copy of New Text Documen ??" t.txt
files\\fofo.txt
files\
ew Text Document.txt
files\\worstcase ??"???.txt

因此,在我的文件名到达其他工具之前,我的文件名发生了一些奇怪的事情(我一直在尝试使用Windows的sed端口从名为GnuWin32的东西进行此操作,但到目前为止还没有运气),并且对这些字符进行替换不会要么帮助。

您将如何解决这个问题?我可以使用任何类型的工具,命令行或其他方式...

编辑:这是一个一次性的问题,所以我正在寻找一个快速的'n丑陋的修复


您可以使用此代码(Python)

重命名国际文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- 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"\
Dir :" + 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)

###

您必须更改编码和字符表(我用西班牙语文件测试了此脚本,并且工作正常)。您可以对" move"行进行注释,以检查其是否正常运行,并在以后删除注释以进行重命名。


如果在UNICODE模式下打开cmd.exe,可能会更加幸运。使用" cmd / U"。

其他人则建议使用一种真正的编程语言。很好,尤其是如果您使用一种非常熟悉的语言。我在C#团队中的朋友说,C#3.0(与Linq一起使用)非常适合编写这样的快速,小型程序。他大部分时间都停止写批处理文件。

就个人而言,我会选择PowerShell。此问题可以直接在命令行上并在一行中解决。生病

编辑:这不是一行,但也不是很多代码。另外,看起来StackOverflow不喜欢语法" $ _。Name",并将_呈现为/ p>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$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.
}

我要编写一个vbscript(WSH)来扫描目录,然后将文件名发送到一个将文件名分解为单个字母的函数,然后对瑞典文字母进行SELECT CASE并将其替换为所需的字母。或者,代替执行该功能可能只是通过一堆REPLACE()函数将其删除,然后将输出重新分配给输入字符串。最后,它将使用新值重命名文件。


我将用C ++,C#或Java编写这些代码-我确定可以从路径中正确获取Unicode字符的环境。使用命令行工具始终是不确定的,尤其是在Cygwin之外。

那么代码就是简单的查找/替换或正则表达式/替换。如果您可以命名一种语言,则编写代码很容易。


推荐阅读

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux文件io命令?

    linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

    改文件linux命令行?

    改文件linux命令行?,地址,系统,工作,信息,数字,文件,命令,设备,密码,权限,lin

    linux删除本行命令?

    linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

    拷贝文件夹linux命令?

    拷贝文件夹linux命令?,系统,地址,服务,信息,密码,情况,单位,项目,命令,文件,l

    进入文件夹linux命令?

    进入文件夹linux命令?,系统,密码,终端,目录,标的,一致,传播,图片,环境,工作,l

    打包文件命令linux?

    打包文件命令linux?,系统,时间,工具,名称,命令,文件,目录,格式,表示,详细信

    linux删除命令文件夹?

    linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

    linux文件io命令?

    linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

    linux中文件编辑命令?

    linux中文件编辑命令?,系统,工作,工具,信息,地址,发行,命令,第一,检测,基础,l

    linux文件格式的命令?

    linux文件格式的命令?,设备,命令,系统,文件,标准,代码,情况,电脑,平台,数据,l

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux命令行编译文件?

    linux命令行编译文件?,代码,系统,项目,工具,网上,手机,电脑,地址,官网,文件,L

    linux下文件写入命令?

    linux下文件写入命令?,系统,信息,文件,名字,电脑,软件,目录,命令,内容,指令,l

    linux命令替换字符串?

    linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结

    linux里删除区间命令?

    linux里删除区间命令?,系统,命令,情况,档案,不了,名称,目录,文件,文件夹,分

    linux命令备份文件夹?

    linux命令备份文件夹?,设备,系统,文件,命令,备份,情况,做好,名字,灵活,数据,l

    linux命令中转义字符?

    linux命令中转义字符?,标准,本行,密码,字符,电脑,系统,环境,数据,命令,终端,l

    linux命令安条件删除?

    linux命令安条件删除?,系统,命令,不了,通用,名称,文件夹,文件,目录,软件,子

    linux命令重命名配置?

    linux命令重命名配置?,图片,名称,名字,文件,软件,代码,命令,文件名,脚本,批