私の目標は、macOS Photos.appデータベースを読み、ここに含まれている写真のパスを見つけることです。アルバムとその親フォルダの名前は次のとおりです。RKフォルダ写真ごとにフォームを決定できます。親フォルダは別のフォルダに配置できます。生成されたフォルダパスを読み取ることもできますが、形式は次のとおりです。
modelId 1/modelID 2/modelId 3/modelID 4
文字列を実際のフォルダ名に置き換えるのに十分な知識がないため、ここではこれ以上進めません。考えられる解決策を見つけるためにデータベースのコピーを使用しているので、フォルダパスをRKFolderテーブルに直接書き込むこともできます。
SELECT
modelId, name,folderPath, uuid
FROM RKFolder
WHERE implicitAlbumUuid not NULL
結果(抜粋)
modelId name folderPath uuid
1 1/ LibraryFolder
2 TopLevelAlbums 1/2/ TopLevelAlbums
7 Test 1/2/7/ kbY7RDHjRLS
8 xxx 1/2/8/ bT5WAkPWQ1
9 Test 1/2/8/9/ 9PYeLZDRTne
10 ab 1/2/10/ 7Cse21+1SIag
11 abc 1/2/7/11/ pNMvzDdyS%
16 efg 1/2/7/11/16/ a6R97tAxSBW
次のように交換してください。
modelId name folderPath uuid
1 / LibraryFolder
2 TopLevelAlbums /TopLevelAlbums/ TopLevelAlbums
7 Test /TopLevelAlbums/Test/ kbY7RDHjRLS
8 xxx /TopLevelAlbums/xxx/ bT5WAkPWQ1
9 Test /TopLevelAlbums/xxx/Test/ 9PYeLZDRTne
10 ab /TopLevelAlbums/ab/ 7Cse21+1SIag
11 abc /TopLevelAlbums/Test/abc/ pNMvzDdyS%
16 efg /TopLevelAlbums/Test/abc/efg/ a6R97tAxSBW
または、TopLevelAlbums-mainフォルダがない場合は、より良いです。
modelId name folderPath uuid
16 efg /Test/abc/efg/ a6R97tAxSBW
これまで使用しているスクリプトは次のとおりです(省略)。
SELECT
RKAlbumVersion.versionId,
RKVersion.filename,
(SELECT RKFolder.folderpath from RKFolder, RKAlbum
WHERE RKFolder.uuid = RKAlbum.folderUuid
and RKAlbum.modelID = RKAlbumVersion.albumId)
FROM RKMaster, RKAlbumVersion, RKVersion
WHERE RKVersion.modelId = RKAlbumVersion.versionId
and RKVersion.masterUuid = RKMaster.uuid
-->
Output:
77 001.JPG 1/2/7/11/16/
replace with:
77 001.JPG /Test/abc/efg/
ベストアンサー1
Perlを使用してこれを行うことができます。
#!/usr/bin/perl
# number of parent directories to drop
$drop = 2;
open( $input, '<', $ARGV[0] );
# drop header lines
$line = <$input>;
$line = <$input>;
# third line is first data, being root has no name, was requested that it wasn't used, which is good, because it makes life simplier, assuming the first dir is always 1
$line = <$input>;
#@databits = split(/\s+/, $line);
$hash{'1'} = '';
while ( $line = <$input> ) {
@databits = split(/\s+/, $line);
$hash["$databits[0]"] = $databits[1];
}
close( $input );
open( $input, '<', $ARGV[0] );
# now we print!
# headers
$line = <$input>;
print "$line";
$line = <$input>;
print "$line";
# drop first data line
$line = <$input>;
while ( $line = <$input> ) {
@databits = split(/\s+/, $line);
@replace = split(/\//, $databits[2]);
$count = 0; # start at the start
foreach (@replace) {
$replace[$count] = $hash[$_];
$count++;
}
for (my $i=0; $i < $drop; $i++) {
shift(@replace);
}
$replaced = join('/', @replace);
if ( $replaced ne '' ) {
print "$databits[0] $databits[1] /$replaced/ $databits[3]\n";
}
}
次の例では、「input」という名前のテキストファイルとして出力を入力します。列命令を使用すると、美しい列を作成できます。
$ ./replace.pl input | column -t
modelId name folderPath uuid
7 Test /Test/ kbY7RDHjRLS
8 xxx /xxx/ bT5WAkPWQ1
9 Test /xxx/Test/ 9PYeLZDRTne
10 ab /ab/ 7Cse21+1SIag
11 abc /Test/abc/ pNMvzDdyS%
16 efg /Test/abc/efg/ a6R97tAxSBW