如何批量重命名从 OSX 复制到 Windows 的文件名中包含“:”的文件?

tpu*_*nen 3 batch rename filenames

这实在令人费解。我有很多使用 Mac OS 存储的视频,现在我必须在 Windows XP 上编辑它们。我使用 HFSExplorer 复制文件。编辑软件拒绝打开当前名称的文件,到目前为止我还没有找到批量重命名所有文件的方法。

文件的名称如下所示:

剪辑-2009-10-01 21;26;00.mov

但我怀疑 OSX 中的时间是 21:26:00。

我想用下划线替换空格,用破折号替换分号。

我已经尝试过几个批量重命名应用程序,使用 ; 和:,但徒劳。我也尝试过 rename.pl,但也是徒劳。

qua*_*ote 5

更新

我们假设“clip-2009-10-01 21;26;00.mov”不是实际的文件名;一种可能性是实际文件名是“clip-2009-10-01 21:26:00.mov”。但是,我们无法在 Windows 下验证这一点。

我们可能不需要。


故障保护方法

启动至 Linux LiveCD。Ubuntu 9.04 具有良好的 NTFS 支持,并且 Linux 比 Windows 处理更多的文件名中的不稳定字符。perl 重命名脚本可以作为系统的重命名命令包含在内。


这实际上可能可以工作批处理方法(新脚本!)

DOS 命令 DIR/X 显示短文件名(如果您的系统上存在这些文件名) 。

$ cmd
c:\test> dir /x
 Volume in drive E is NUVOL
 Volume Serial Number is 80D3-A96D

 Directory of e:\tor\test

10/04/2009  05:15 AM    <DIR>                       .
10/04/2009  05:15 AM    <DIR>                       ..
10/04/2009  05:11 AM                 0 CLIP-2~1.MOV clip-2009-10-01 21;26;00.mov
               1 File(s)              0 bytes
               2 Dir(s)   5,201,670,144 bytes free
Run Code Online (Sandbox Code Playgroud)

如果它们确实存在,REN 命令会将它们移至新名称;新名称可以是新的(有效)长文件名。

c:\test> ren CLIP-2~1.MOV "clip-2009-10-01_21-26-00.mov"
Run Code Online (Sandbox Code Playgroud)

这就是修复一个的方法。

要批量处理所有文件,您需要 1) 获取要移动的所有文件的列表;2) 运行一个简短的 perl 脚本,使用适当的 REN 命令将列表转换为批处理文件;3) 运行生成的批处理脚本。

c:\test> dir /x > mybrokenfiles.lst  
$ cat mybrokenfiles.lst | perl -lne 'next if not /MOV/; s/^.{1,39}//; s/^/ren /; s/ (\d\d);(\d\d);(\d\d)/_$1-$2-$3/; print' > fixmybrokenfiles.bat  
c:\test> fixmybrokenfiles.bat  
Run Code Online (Sandbox Code Playgroud)

perl 命令行采用非常特殊的输入格式,因此如果 DOS 列表以“21;26;00.mov”格式以外的格式显示长文件名,它可能不会完全按照您的要求执行。如果您尝试这样做,请在运行之前仔细检查批处理脚本是否正确。

如果您熟悉 perl(或 sed/awk、python,等等),您可以自己编写脚本。但是,如果 DIR/X 不显示短文件名,则说明您的系统已禁用它们,并且此解决方案将无济于事。


原始答案:根据我们现在所知没有用,但是如果您再次从 OSX 复制此类文件,您可以在复制之前使用此文件作为预防步骤。

我在 Windows 和 Linux 系统上都经常使用命令行。互联网上有一个方便的 Perl 脚本,它允许使用标准 Perl 正则表达式进行批处理文件重命名(通过 google 搜索 rename.pl 可以找到它)。

在 Windows 上的 Cygwin 下,在文件所在的目录中使用它来重命名它们:

$ ls
clip-2009-10-01 21;26;00.mov

$ rename.pl 'tr/ ;/_-/;' * 
$ ls
clip-2009-10-01_21-26-00.mov
Run Code Online (Sandbox Code Playgroud)

很确定我的版本来自Perl Cookbook

#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}
Run Code Online (Sandbox Code Playgroud)