今天去拿了幾卷沖掃好的底片回來,果然又有幾卷被掃錯了方向,也就是說應該由前往後掃的,卻被由後往前掃,當然在 Lightroom 裡,只要在檢視裡把依檔名排序改成降冪就可以解決顯示順序的問題,但如果是從資料夾裡直接看,順序不對看得就很痛苦,好久以前就有這樣的困擾,所以用 Perl 寫了一個 script,可以把檔名編號反轉。例如:
錯誤的順序: 76320001.jpg 76320002.jpg 76320003.jpg 76320004.jpg
↓ ↓ ↓ ↓
正確的順序: 76320004.jpg 76320003.jpg 76320002.jpg 76320001.jpg
看了一下檔案最後編輯的日期是 2011-5-28,已經是快六年前的事了,因為也好久沒有沖掃底片了,有點忘了上次執行它是什麼時候,但沒想到這個 script 還可以正常運作,系統可能都更新好幾次了,也是讓我有點訝異的地方,為了怕以後電腦重灌還是資料不見之類的,放一份到 Gist 上,順便做個記錄。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl -w
use File::Copy;
use utf8;
use strict;
my $usage = "Usage: $0 from to.";
if (not defined $ARGV[0] or not defined $ARGV[1]) {
die "$usage\n";
}
my $from_no = $ARGV[0];
my $to_no = $ARGV[1];
if ($from_no !~ /^\d+$/ or $to_no !~ /^\d+$/ or $from_no >= $to_no) {
die "$usage\n";
}
my $len = (length $from_no > length $to_no ? length $from_no : length $to_no);
if ($len < 2) { $len = 2; }
my $pattern = '%0'.$len.'d';
my @files = <*>;
@files = sort @files;
my $range_pat;
for my $ii ($from_no .. $to_no) {
$range_pat .= (sprintf '%0'.$len.'d', $ii).'|';
}
chop $range_pat;
@files = grep {m/.?($range_pat)\.jpg/i} @files;
my $i = 0;
my @files2;
for my $f (@files) {
my $rep = sprintf "%0".$len."d_", $to_no - ($i++);
$f =~ m/^(.*)(\d{$len})(\.jpg)$/i;
my $new_f = $1.$rep.$3;
push @files2, $new_f;
move($f, $new_f) || die "move: $!";
}
$i = 0;
for my $f (@files2) {
#my $rep = sprintf "%0".$len."d", $from_no + ($i++);
$f =~ m/^(.*)(\d{$len})_(\.jpg)$/i;
my $new_f = $1.$2.$3;
move($f, $new_f) || die "move: $!";
}
話說我現在根本完全看不懂 Perl 究竟是在寫什麼鬼了啊! XD