tpu*_*nen 3 batch rename filenames
这实在令人费解。我有很多使用 Mac OS 存储的视频,现在我必须在 Windows XP 上编辑它们。我使用 HFSExplorer 复制文件。编辑软件拒绝打开当前名称的文件,到目前为止我还没有找到批量重命名所有文件的方法。
文件的名称如下所示:
剪辑-2009-10-01 21;26;00.mov
但我怀疑 OSX 中的时间是 21:26:00。
我想用下划线替换空格,用破折号替换分号。
我已经尝试过几个批量重命名应用程序,使用 ; 和:,但徒劳。我也尝试过 rename.pl,但也是徒劳。
更新:
我们假设“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)