[英]Batch renaming of files with international chars on Windows XP
我有一大堆文件名使用我们可爱的瑞典字母å å和ö 。 由于各种原因,我现在需要将这些转换为 [a-zA-Z] 范围。 只需删除此范围之外的任何内容就相当容易。 给我带来麻烦的是,我想用a替换å ,用o替换ö等等。
这是最糟糕的字符集问题。
我有一组测试文件:
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 端口来执行此操作,但到目前为止没有运气)并且对这些字符进行替换并没有帮助。
你会如何解决这个问题? 我对任何类型的工具、命令行或其他方式持开放态度……
编辑:这是一个一次性的问题,所以我正在寻找一个快速的“丑陋的修复”
如果您在 UNICODE 模式下打开 cmd.exe,您可能会更幸运。 使用“cmd /U”。
其他人建议使用真正的编程语言。 这很好,特别是如果你有一种你非常熟悉的语言。 我在 C# 团队的朋友说 C# 3.0(带有 Linq)非常适合开发这样的快速、小程序。 大多数时候他已经停止编写批处理文件。
就个人而言,我会选择 PowerShell。 这个问题可以直接在命令行上解决,也可以在一行中解决。 患病的
编辑:它不是一行,但也不是很多代码。 此外,看起来 StackOverflow 不喜欢语法“$_.Name”,并将 _ 呈现为 _。
$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.
}
您可以使用此代码(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)
###
你必须改变你的编码和你的字符表(我用西班牙语文件测试了这个脚本并且工作正常)。 您可以评论“移动”行以检查它是否正常工作,然后删除评论以进行重命名。
我会用 C++、C# 或 Java 编写它——我确信在这些环境中您可以正确地从路径中获取 Unicode 字符。 命令行工具总是不确定的,尤其是在 Cygwin 之外。
然后代码是一个简单的查找/替换或正则表达式/替换。 如果您可以命名一种语言,则编写代码将很容易。
我会写一个 vbscript (WSH) 来扫描目录,然后将文件名发送到一个函数,该函数将文件名分解为单独的字母,然后对瑞典语进行 SELECT CASE 并将它们替换为您想要的。 或者,该函数不是这样做,而是通过一堆 REPLACE() 函数将其删除,将输出重新分配给输入字符串。 最后,它会使用新值重命名文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.