【发布时间】:2013-10-16 01:34:46
【问题描述】:
我的 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();
这些帖子是相关的,但并没有真正解决我的问题,
- 使用引号:How to handle filenames with spaces?(使用其他脚本,最好去掉引号)
- File::Find perl script to recursively list all filename in directory(是的,但我还有其他原因)
- 网址转义:Modifying a Perl script which has an error handling spaces in files(不是网址)
- 引用元:How can I safely pass a filename with spaces to an external command in Perl?(不是网址)
【问题讨论】:
-
您不使用
File::Find的“其他原因”是什么?它非常适合此目的,并且是核心模块,因此不需要安装。 -
从子程序中删除了前导 & 符号,使用了内置重命名