我的Linux系統掛載了一些Samba共享,並且一些文件由Windows用戶存放。這些文件的名稱有時包含空格和其他不受歡迎的字符。將這些字符更改爲連字符-
似乎是一個合理的解決方案。沒有其他需要更改來處理這些清理的文件名稱。Perl腳本使用名稱中的空格重命名文件,pushd/popd等效於?
幾個問題,
什麼其他字符,除了空格,括號應該翻譯?
應該檢查其他文件屬性(除了文件類型(文件/目錄)和權限)?
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?(使用其他腳本,寧願刪除需要報價)
- 文件::查找perl script to recursively list all filename in directory(是的,但我有其他的原因)
- URL轉義:Modifying a Perl script which has an error handling spaces in files(而不是URL)
- Quotemeta:How can I safely pass a filename with spaces to an external command in Perl?(而不是URL)
你有什麼*「其他原因」*不要使用'File :: Find'?它非常適合此目的,並且是核心模塊,因此不需要安裝。 – Borodin
從子程序中刪除了主導符號,使用內置重命名 – ChuckCottrill