「Finderで付けた複数カラー・タグ」を「Terminalコマンドで如何に処理」すればよいか?

近くのトピックに触発されて、Finderの動作をエミュレートするスクリプトを作成中です。


手始めに「Finderの表示モード;Date Modified ^」をyyyy-mm-dd-HH:MMで表示するスクリプトを作って見ました。


結果、Finderよりも視認性が良くて良いです。出来てみると「Finderで付けたカラー・タグ」を付けたくなり、探してみましたがファイルに一色のタグの場合は読めるものの、複数タグの場合は、最後に付けたタグしか読めません。


テスト用に作ったフォルダ中の「Finderのキャプチュア」を下図に示します。



上記フォルダ中で、実施したコマンドは;

「xattr -p -x com.apple.FinderInfo *」

その出力を図2に示します;


以上、宜しくお願いします。

Mac mini, macOS 10.14

投稿日 2019/05/31 09:42

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2019/06/01 20:28

タグの取得だけで良いなら、最初のコメントに書いたように mdls や xattr でできますよ。これなら簡単なシェルスクリプトでいけるはず。


あと、タグの設定については、


xattr -p com.apple.metadata:_kMDItemUserTags "file" | xxd -r -p | plutil -convert xml1 -o - -- -


↑これと逆のことをやれば xattr でできます。


#!/bin/bash

#
# usage: bash me.sh file1 file2 ...
#

tags='["01\n7","02\n6"]'

[[ $# > 0 ]] || { echo "usage: bash $0 file1 file2 ..." >&2; exit 1; }

for f in "$@"; do
    tags_value=$(echo "$tags" | plutil -convert binary1 -o - -- - | xxd -p)    
    xattr -wx com.apple.metadata:_kMDItemUserTags "$tags_value" "$f"
done


ただし、この場合は Finder や setResourceValue:forKey:error: メソッドとは異なり、設定されるのは「タグのみ」となります。


tags='["01\n7","02\n6"]' のところは '["タグ名\nラベルインデックス"]' または '["タグ名"]' みたいな感じで、JSON の配列で指定してください。


返信: 59

2019/06/01 09:30 Hiro__S への返信

取り敢えず「タグを取得する JXA スクリプト」を動かしました。


それに対応したemojiを振って見ます。


javascriptは文法的には抵抗感がありませんが、NSナンチャラと仲良しに慣れなそうです泣。


ldmと言う自作コマンドに組み込もうと思います。


ところで、「JXA スクリプト」をXcodeで制作・デバックは可能でしょうか?osascriptというのは馴染みにくいです。


中間報告まで。


2019/06/02 07:08 Hiro__S への返信

Hiro.Sさん、


> 同色でも別名なら大丈夫です。一応ご確認を。


先ほどタグの設定で、英語名とカタカナ名があったので、カタカナ名を削除してしまいました。


例えば、赤色の表現として

  • red
  • Red
  • RED
  • レッド

などは同時に使えると言うことですか?


今日は疲れたので、Xcodeとの格闘は終了します。


中間報告まで。

2019/06/03 02:33 mNeji への返信

> 不等号らしい記号(=/=)の入力方法が判りませんでした。


紛らわしくて済みません。"=/="と見えるのは"!="です。

これはFireCodeフォントによる改変です。

https://github.com/tonsky/FiraCode


オプションの扱いを少々マシにして、bashで扱いやすくしてみたので変わってしましましたが...


実行の様子。

2019/06/09 02:32 Hiro__S への返信

Hiro.S さんによる書き込み:

画像が壊れているのではなく、このボードの調子が悪いようです。Firefox なら、「該当する部分 (破れた書類のアイコン) を右クリック > 画像を再読み込み」としてください。正しく読み込まれるはずです。


速攻コメントありがとうございます。


ホッとしたので、コーヒを飲みに行きます!

2019/05/31 15:54 mNeji への返信

タグを取得する JXA スクリプト


//
// usage: osascript -l JavaScript me.applescript file1 file2 ...
//

function run(argv) {
    let argc = argv.length;

    if (argc < 1) {
        return 1;
    }

    for (let f of argv) {
        if ($.NSFileManager.defaultManager.fileExistsAtPath(f)) {
            let res = get_tags(f);
            console.log([f, res]);
        }
    }
}

function get_tags(fpath) {
    let furl = $.NSURL.fileURLWithPath(fpath);
    let err = $();
    let dct = furl.resourceValuesForKeysError(['NSURLTagNamesKey'], err);

    if (dct.allKeys.containsObject('NSURLTagNamesKey')) {
        let tags = dct.objectForKey('NSURLTagNamesKey');
        return ObjC.deepUnwrap(tags);
    } else {
        return 'n/a';
    }
}


2019/05/31 15:55 mNeji への返信

タグを設定する JXA スクリプト


['01', '02'] のところは適宜書き換えてください。タグ名の配列です。


//
// usage: osascript -l JavaScript me.applescript file1 file2 ...
//

function run(argv) {
    let argc = argv.length;

    if (argc < 1) {
        return 1;
    }

    for (let f of argv) {
        if ($.NSFileManager.defaultManager.fileExistsAtPath(f)) {
            let res = set_tags(['01', '02'], f);
            console.log(res);
        }
    }
}

function set_tags(tags, fpath) {
    let furl = $.NSURL.fileURLWithPath(fpath);

    let err = $()
    let res = furl.setResourceValueForKeyError(
        Array.from(new Set(tags)),
        'NSURLTagNamesKey',
        err
    );

    if (res) {
        return fpath;
    } else {
        return fpath + ': ' + err.localizedDescription.js;
    }
}


このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

「Finderで付けた複数カラー・タグ」を「Terminalコマンドで如何に処理」すればよいか?

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。