1

以前は、デスクトップ上で次の形式のファイルの任意のセットを取得していました。

スクリーンショット 2011-11-08 at 8.10.23 AM.png

スクリーンショット 2011-11-08 at 8.08.57 AM.png

それらに対してPerlスクリプトを実行し、それらの名前を

SS-2011-11-08 at 8.10.23 AM.png

SS-2011-11-08 at 8.08.57 AM.png

これは機能しなくなり、名前の変更は行われません。変更する必要があるので、次のように変更したいと思います。

ss-2011.11.08.at.8.10.23.AM.png

ss-2011.11.08.at.8.08.57.AM.png

  • 「スクリーンショット」を常に「ss」に置き換えます。
  • -すべてをに置き換えます.
  • すべてのスペースを.

私はそれが貪欲に関係していることを知っていますが、私はこれを書いていませんでした. 私は自分の人生で数時間ずっとperlを使用してきました。私はこれをphpで数行で行うことができると思いますが、デバッグできることは常に良いことなので、perlで保持する方法を学びたいと思います. regs フォーマット規則を調べましたが、適用されません。Mac OS X Lion のどこかがおかしくなっているのか、Snow Leopard が許してはならないことが起こってしまったのかのどちらかです。

皆さん、ありがとうございました!

これが私がこれまでに持っているものです:

 #!/usr/bin/perl -w

 chdir( "/Users/me/Desktop" ) or die;
 my @files = ();
 print "after my \@files array\n";
 print @files;

 while ( <*> ) {
    push @files, $_ if m!^Screen Shot (.*) at (.*)\.png!;
 }


 foreach my $f ( @files ) {
    my $new = $f;
    $new =~ s!^SS (.*) at (.*)\.png!ss-$1\_$2.png!;
    print "$f -> $new\n";
    rename ( $f, $new ) or die;
 }
4

4 に答える 4

1

置き換えをこれに変更するだけです

$new =~ s/Screen\.Shot\.(.*)\.at\.(.*)/ss-$1.at.$2/;

その前に別の置換を追加します。

$new =~ s/[- ]/./g;  # Replace all dashes and spaces to dots
于 2011-11-08T17:24:53.353 に答える
0

Snow Leopardを実行していて、スクリーンショットはとして保存されます(の小文字にScreen shot ...注意してください)。Lionは大文字を使用するようになりましたか?もしそうなら、そしてあなたの元のスクリプトが小文字を使用していたなら、それはおそらくそれを壊したものでした。いずれにせよ、それを修正しましょう。sshotSs

あなたの代用

$new =~ s!^SS (.*) at (.*)\.png!ss-$1\_$2.png!;

は、で始まり、その後にスペースが続くファイル名を探していますが、ファイル名SSを変更したいようです。ファイル名は、で始まり、SSその後に-または Screen [Ss]hotスペースが続きます。

また、@ FailedDevが指摘しているように、ループは配列に一致するwhileファイルのみを追加しているため、ループでは.で始まるファイルは表示されません。^Screen Shot (.*) at (.*)\.png@filesforeachSS

コードを次のように置き換えます。

#!/usr/bin/perl -w
use strict; # ALWAYS!

chdir( "/Users/me/Desktop" ) or die("Could not chdir() to ~/Desktop: $!");
foreach my $f (<*>) {
    my $new = $f;
    if ($new =~ s!^(?:SS-|Screen [Ss]hot )([\d-]+) at ([\d\.]+) ([AP]M)\.png!ss-$1.at.$2.$3.png!) {
        $new =~ s/\-/\./g;
        print "$f -> $new\n";
        rename ( $f, $new ) or die("Could not rename $f to $new: $!");
    }
}

何が起こっているのかを理解するのに役立ちます。

  • ^afters!は、置き換えるテキストの先頭のみを確認することを意味します。この場合はファイル名です。
  • |betweenSS-Screen [Ss]hot[groupedby ]は、またはのいずれか(?:)を探すことを意味します。SS-Screen [Ss]hot
  • () [なしで囲まれた?:]3つのキャプチャグループにはスペースが含まれていないため、、、、$1および$2置換$3ではスペースが含まれません。
  • このステートメントは、ファイル名が一致し、置換が実際に行われる場合にのみ、ブロックif内のコードが実行されることを保証します。if
于 2011-11-08T19:00:46.523 に答える
0

以下の正規表現に一致するすべてのファイルを配列に追加している間:

/^Screen Shot (.*) at (.*)\.png/

次に、前述の配列のすべてのファイルを次のように置き換えようとします。

/^SS (.*) at (.*)\.png/

これが機能するとどのように期待できますか?

于 2011-11-08T17:37:38.490 に答える
0

最初の式 ( 内if)

m!^Screen Shot \d+-\d+-\d+ at \d+\.\d+\.\d+\s[AP]M\.png$!

2番目の式(キャプチャグループを除いて一致式は同じであるため、技術的に冗長だと思いますが)は次のようになります。

s!^Screen Shot (\d+)-(\d+)-(\d+) at (\d+)\.(\d+)\.(\d+)\s([AP]M)\.png$!ss-$1.$2.$3.at.$4.$5.$6.$7.png!

少なくとも私にとってはうまくいきます!

分解したい場合は、お尋ねください。

于 2011-11-08T18:27:33.523 に答える