Tuesday, 10 August 2010

iPhoto の重複を探す

Papers で、size で見れば重複はだいたいわかると理解したので、iPhoto もやってみました。

  #!/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: