我的 Linux 系统挂载了一些 Samba 共享,一些文件是 Windows 用户存放的。这些文件的名称有时包含空格和其他不需要的字符。将这些字符更改为连字符-
似乎是一个合理的解决方案。无需更改任何其他内容即可处理这些已清理的文件名。
几个问题,
除了空格、括号外还有哪些字符需要翻译?
应该检查哪些其他文件属性(除了文件类型(文件/目录)和权限)?
Perl 是否提供
pushd
/popd
等价物,或者是chdir
遍历目录树的合理解决方案?
这是我的 Perl 程序
#!/bin/env perl
use strict;
use warnings;
use File::Copy;
#rename files, map characters (not allowed) to allowed characters
#map [\s\(\)] to "-"
my $verbose = 2;
my $pat = "[\\s\\(\\)]";
sub clean {
my ($name) = @_;
my $name2 = $name;
$name2 =~ s/$pat/\-/g;
#skip when unchanged, collision
return $name if (($name eq $name2) || -e $name2); #skip collisions
print "r: $name\n" if ($verbose > 2);
rename($name, $name2);
$name2;
}
sub pDir {
my ($obj) = @_;
return if (!-d $obj);
return if (!opendir(DIR, $obj));
print "p: $obj/\n" if ($verbose > 2);
chdir($obj);
foreach my $dir (readdir DIR) {
next if ($dir =~ /^\.\.?$/); #skip ./, ../
pDir(clean($dir));
}
close(DIR);
chdir("..");
}
sub main {
foreach my $argv (@ARGV) {
print "$argv/\n" if ($verbose > 3);
$argv = clean($argv);
if (-d $argv) { pDir($argv); }
}
}
&main();
这些帖子是相关的,但并没有真正解决我的问题,
- 使用引号:如何处理带空格的文件名?(使用其他脚本,更喜欢消除对引号的需求)
- File::Find perl script 以递归方式列出目录中的所有文件名(是的,但我有其他原因)
- URL 转义:修改在文件(不是 url)中有错误处理空间的 Perl 脚本
- Quotemeta:如何安全地将带空格的文件名传递给 Perl 中的外部命令?(不是网址)