#!/usr/bin/perl
open(FIND, "find ~/Pictures/iPhoto/Originals -name '*.jpg' -ls -or -name '*.J
PG' -ls | sort -n -k 7 |");
my $nocheck = 0;
my $size = 0;
my $prev;
while(<FIND>) {
my @data = split;
if ($data[6]==$size && $size>0) {
my $f1 = "@data[10..$#data]";
my $f2 = $prev;
open(F1,$f1); my $r1 ; sysread(F1,$r1, 4096*2); close(F1);
open(F2,$f2); my $r2 ; sysread(F2,$r2, 4096*2); close(F2);
if ($nocheck || $r1 eq $r2 ) {
print "@data[10..$#data]\n";
}
}
$size = $data[6];
$prev = "@data[10..$#data]\n";
}
で、重複した写真のファイル名が得られるわけですが、これを perl -nle unlink dup.txt とかでいきなり削除するのは、まずいよね。いや、ありかも知れないが、このscriptが信用できん:-)
で、どうするかと言うと、
iPhotoの特定のアルバムに入れます
そのアルバムを全部選択します
写真(Photos)にいくと、それが選択されているので
その中のを、Command click を二回すると
Photos の中で全部が選択される
あっているかどうかを確認して削除
ってな手順。アルバムに入れるのは AppleSript。
on readFileAt(aFile, lineNum)
return do shell script ("head -n " & lineNum & " " & aFile & " | tail -n 1")
end readFileAt
on lineOfFile(aFile)
set wc to do shell script ("wc -l " & aFile)
return word 1 of wc
end lineOfFile
tell application "iPhoto"
set aFile to "/tmp/list.txt"
set e to my lineOfFile(aFile)
set al to some album whose name is "duplicate"
set i to 1
repeat while e > i
set str to my readFileAt(aFile, i)
if length of str 1 then
exit repeat
end if
try
set aPhoto to some photo whose original path is str
add aPhoto to al
end try
set i to i + 1
end repeat
end tell
ファイルの読み込みが最低。
ファイルの書き出しも、do shell script で出来るのかも知れないが、良くわからないです。redirect 出来たかなぁ。この前は、TextEdit 使ったが。あれも最低だった。
No comments:
Post a Comment