私の 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::ディレクトリ内のすべてのファイル名を再帰的にリストするための Perl スクリプトを検索します(はい、他の理由があります)
- URL エスケープ:ファイル内のスペース(URL ではない)の処理でエラーが発生する Perl スクリプトの変更
- Quotemeta: Perl でスペースを含むファイル名を外部コマンドに安全に渡すにはどうすればよいですか? (URLではありません)