0

私の 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();

これらの投稿は関連していますが、実際には私の質問に対処していません。

4

2 に答える 2