1
$dir = "/home/naveen/mp3tag/testfolder";
opendir(DMP3, $dir) || die("Cannot open directory");
@files= readdir(DMP3;
foreach $f (@files)
{
  unless ( ($f eq ".") || ($f eq "..") )
  {
    $oldfile = $f;
    $newfile = $f;
    $newfile =~ s/ /_/g;
    print "Old file: $oldfile \t";
    print "New file: $newfile";
    print "\n";
    rename ("$oldfile", "$newfile") or warn "Couldn't rename $oldfile to $newfile !\n";
  } 
}

既存のファイルにアンダースコアを追加して名前を変更する簡単なプログラムを作成しています。これは、コードを使用してどこまで到達したかです。ただし、ファイルの名前を変更できず、警告が表示され、どこに間違いがあるのか​​ わかりません。

また、cmd 行で同じ行を試したときに、次のエラー メッセージが表示されます。

$ rename Jacques\ Greene\ -\ Clark\ \(Original\ Mix\).mp3 JG - C.mp3
Bareword "mp3" not allowed while "strict subs" in use at (eval 1) line 1.

$ rename Jacques\ Greene\ -\ Clark\ \(Original\ Mix\) JG - C
Can't locate object method "Original" via package "Mix" (perhaps you forgot to load "Mix"?) at (eval 1) line 1.
4

3 に答える 3

2

1 つのファイルだけでなく、ディレクトリ内のすべてのファイルの名前を変更しようとしています。あなたがそれについて言及しなかったので、エラーは非常に多くのものである可能性があり、私は推測することしかできませんでした.

rename私が思い出したように、少し不安定で、File::Copymoveから使用する方が安全です。また、ディレクトリの名前を変更したくない場合もあります。より直感的なインターフェイスを使用することも、おそらく悪い考えではありません。

最大の間違いの 1 つは、 を使用しないことuse strict; use warnings;です。これらを除外することによって自分自身にもたらされるトラブルの量を過小評価することはできません.

use strict;
use warnings;
use File::Copy qw(move);

for (@ARGV) {
    my $org = $_;
    tr/ /_/;
    move($org, $_) or warn "Couldn't move $org to $_: $!";
}

使用法:

perl script.pl /home/naveen/mp3tag/testfolder/*.mp3

したがって、引数として適切なグロブを指定する限り、スクリプトはそれらのファイルにのみ影響します。さらにチェックを追加して、より厳密にすることができます。

あなたのコマンドラインの試みが /usr/bin/rename のツールを使用することを意図している場合、引用符を使用することでエラーを簡単に回避できると推測する危険があります。

于 2012-04-21T14:44:09.293 に答える
1

この実際の例が役立つかもしれません

use strict;
use warnings;
use File::Copy;

my $dir = '/home/naveen/mp3tag/testfolder';
my @mp3s = glob ("$dir/*.mp3");

for my $mp3 (@mp3s) {
    my $new_mp3 = $mp3;
    $new_mp3 =~ s/\s/_/g;
    move($mp3, $new_mp3);
}
于 2012-04-22T07:58:48.347 に答える
0

に電話renameしてい/usr/binます。プログラムを呼び出す場合は、より適切な名前を選択するか、フル パスを指定して呼び出します。

ただし、その前に、少なくとも欠落している右ブラケットを に追加してくださいreaddir

于 2012-04-21T14:22:21.807 に答える