「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/05/31 16:22 mNeji への返信

ええと、大量投下した後でふと気付いたのですが、オプション解析とか付けるなら PyObjC の方が良さそうですね。


タグを設定する JXA スクリプトを PyObjC に翻訳するとこんな感じでしょうか。これを基にして作り込むと良いかもしれません。PyObjC は立ち上がりが遅いで、我慢できないならネイティブな Objective-C なり Swift なりで書き換えてください。


#!/usr/bin/python
# coding: utf-8

#
# usage: python me.py file1 file2 ...
#

import sys, os, Cocoa

def set_tags(tags, fpath):
    furl = Cocoa.NSURL.fileURLWithPath_(fpath)

    res, err = furl.setResourceValue_forKey_error_(
        sorted(set(tags), key = tags.index),
        'NSURLTagNamesKey',
        None
    )

    if res:
        out = fpath
    else:
        out = fpath + ": " + err.localizedDescription()

    return out

def main():
    if len(sys.argv) < 2:
        sys.exit('usage: python {0} file1 file2'.format(__file__))

    for f in sys.argv[1:]:
        if not os.path.exists(f):
            continue

        fpath = os.path.abspath(f).decode('utf-8')
        tags = [u'01', u'02']

        out = set_tags(tags, fpath).encode('utf-8')
        print(out)

main()


2019/06/01 22:22 mNeji への返信

当方 (High Sierra 10.13.6) ではできてます。




あと、ラベルは一ファイルにつき一つしか設定できませんよ。また、ラベルは OS の古いバージョンとの互換性を考慮して継続されていると思われ、いつ廃止されるか分かりませんから、今更使うのは悪手だと思います。(どの道複数設定は不可ですが...)


ラベルの取得/設定を紹介したのは、mNeji さんが最初に com.apple.FinderInfo の中身を見ていたので、理解を深めるために紹介しただけです。


JXA が手に負えないようなら、このシェルスクリプトを試してみてはどうでしょうか?


2019/06/02 07:05 hohokihai への返信

hohokihaiさん、


Swiftによるtags設定プログラムのご紹介、ありがとうございました。


未消化のままですが、Mojaveでの動作が期待できそうなのでXcodeで入力をしました。ですが、下図に示すようにエラーがとれません。


  • 不等号らしい記号(=/=)の入力方法が判りませんでした。行番号24,31.エラーとして「Use of unresolved operator '=!='」が出ています。
  • 31行目の「URLResource.tagNamesKey]の「.」より前方部に霧がかかっていて、エラーとして「Editor placeholder in source file」が出ています。


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


中間報告まで。

2019/06/03 06:08 Hiro__S への返信

次から次へと投下してすみませんが、もうちょっと使いやすいものを拵えてみました。


本当は JXA で完結したかったのですが、「NFKC Casefold、かつ、ひらがな/カタカナを区別しない」というのは、とても難しいです。なので、タグを設定する AppleScript (ASOC) を Python から実行するようにしてみました。



実行はこんな感じ

python tags.py -t g1 -t g2 -t g3 *.txt


python tags.py --tag g1 --tag g2 --tag g3 *.txt


簡単なヘルプ付きです

python tags.py -h


python tags.py --help


かっこよくないけど、とりあえずは動くと思います。


2019/06/03 20:34 Hiro__S への返信

あらら、Firefox だと「コード」が正しくコピペできませんね。Safari と Chromium は大丈夫のようです。通常の投稿だと文字数が多すぎてダメみいだし...、困ったものです。


若干修正したものを再投下します。すみません。


実行はこんな感じ。

python tags.py -t red -t orange -- *.txt


python tags.py --tag red --tag orange --tag yellow -- *.txt


ヘルプ

python tags.py -h


python tags.py --help


2019/06/05 00:32 mNeji への返信

> 当方のFinderの設定不良が不良な可能性が高くなってきました。


このコマンドは、Foundation.framework(/System/Library/Frameworks/Foundation.framework)を直接叩いているのでFinderは関係ありません。エラーの原因を探る方法はいくらでもあるのに、zshにすら怒られたなどと茶化して批判するのは、コードを理解しようとする姿勢のなさのあらわれです。


先ずは、sudoを付けて実行することからでしょうか。次の段階に進んだよりSwiftらしいコードを用意していた(書き換えた)ので、表示は若干違います。


ちなみにマニュアル(Xcodeのメニュー→Window→Developer Documentation)は見ていますか?resourceValuesのエラー処理の方法はリンク先に書かれています。


URLのextensionとして別ファイルに定義し直したもの(全容は気が向いたら後ほど


MacErrors.hに定義されているエラーコード(先のエラーコード-5000


2019/06/05 08:44 hohokihai への返信

hohokihaiさん、


>> 当方のFinderの設定不良の可能性が高くなってきました。


>このコマンドは、Foundation.framework(/System/Library/Frameworks/Foundation.framework)を直接叩いているのでFinderは関係ありません。エラーの原因を探る方法はいくらでもあるのに、zshにすら怒られたなどと茶化して批判するのは、コードを理解しようとする姿勢のなさのあらわれです。



このように解釈されるとは思っておりませんでした。私は、お二人が「Finderで赤タグの重複が可能」と説明下さったので、スクリプトを用いれば可能性があると考えました。で、中身の理解よりも、スクリプトの実行に専念し、テストして落胆してのつぶやきでした。


改めて、不愉快をお掛けしたことをお詫び申し上げます。



実は昨日、Xcodeの操作でトラブルを起こしたので、Books.appの『The Swift Programming Language -- Swift 5.1ed. --』を眺めていました。お教えくださったソースを入力しながら、推定した機能が正解だったので、ちょっと自信がつきました。でも、まだまだコードを機能的に理解する段階ではないと思います。


ただ、今回のように、達成する目的が明確な場合、未知の言語(Swift,Python,ASOC)で書かれたスクリプトを入力するだけで、その言語の習得が加速的に早まるのを身に沁みております。



> 先ずは、sudoを付けて実行することからでしょうか。次の段階に進んだよりSwiftらしいコードを用意していた(書き換えた)ので、表示は若干違います。


明日にトライします。



> ちなみにマニュアル(Xcodeのメニュー→Window→Developer Documentation)は見ていますか?resourceValuesのエラー処理の方法はリンク先に書かれています。


これも初めて知りました。Xcodeの操作中に拝見します。



> ちなみにマニュアル(Xcodeのメニュー→Window→Developer Documentation)は見ていますか?resourceValuesのエラー処理の方法はリンク先に書かれています。


今回の問題は解決に時間がかかると感じています。時間が取れた時にお願いできれば幸いです。



> MacErrors.hに定義されているエラーコード(先のエラーコード-5000


ご教示ありがとうございました。

2019/06/08 22:21 Hiro__S への返信

その後気付いたことがあるので、追加情報です。


PyObjC による「ひらがな/カタカナ」変換を再確認もやはりできませんでした...。RubyCocoa (Snow Leopard)、JXA、ASOC は OK ですが、なぜか PyObjC だけダメ...。


これを NKF なしでやるなら、subprocess モジュールを使って JXA か ASOC で変換すれば良いです。Python でゼロから作ることもできますが、外部コマンドの方が簡単だと思います。


それと、Finder からタグを設定するのと同じにするためには、スペース (半角、全角、他)、タブ、改行等の処理も必要のようです。まだ他にもあるかも。全容が分からない以上、Finder と同じにすることは諦めた方が良いかもしれませんね。


文字列比較の際は、NFKC で正規化、小文字化、ひらがなをカタカナに変換...ぐらいにとどめて、Finder と全く同じではありませんよ〜と、注意書きを添えておくのが現実的かも。


スレ汚しすみませんでした。


2019/06/09 01:58 hohokihai への返信

hohokihaiさん、


ご連絡が遅れて申し訳ございません、Hiro.Sの「改訂版tags.py」が動いて、自分の環境でも「同一色の三重タグ」がセットできて、緊張が解け、別件のところで質問して、これもよい回答に恵まれて解決したり、別解を知ったりとしております。


ご指導いただいているSWiftは、遅ればせながらアタックしたい言語だという気持ちは段々と強くなっています。


さて、今回のhohokihaiさんのご投稿では画像かと思われる部分が途中から壊れているようです、下図。



お手隙の時に、もう一度お送り頂ければ幸いです。

2019/06/13 10:50 hohokihai への返信

hohokihaiさん、


いただいた画像を元に、3つの関数を入力して、ビルドが正常に終了したことが確認できました。多くの場合、変数の大文字、小文字の思い込みエラーを潰すのに費やしてしまいました。


順番に;


  1. URL+tagNames.swift ----> URL•tagNames.swift.txt 32行
  2. StandardError.swift ---> StandardError.swift.txt 28行
  3. main.swift ------------> main.swift.txt 86行



なお、main.swiftの(85,86)行は、これ無しではエラーになりました。


一応、全て追加テキストで送ってみます;




以上。


2019/06/15 01:16 hohokihai への返信

hohokihaiさん、


遅れましたが、当方でも無事に動作いたしました。


デスクトップにある3つのディレクトリに着目します、図1;


これに対して、ターミナルからtagnamesによる操作をします、図2;


その結果、3つのディレクトリは、図3;


図2では、Finder表示を省略したために判り難いですが、「-s」が確りと動作していました。


結論として、「tagnamesは確実に動作」しています。


今後、次の課題に注力します;

  1. スクリプトからの利用、スクリプトへの組み込みに取り組みたいとおもいます。
  2. 今回はXcodeへの入力しか手がでませんでしたので、Swiftの文法、デバッグにじっくり取り組みます。
  3. 新しいtagの色は簡単に作れると楽観していたのですが、気長に検索したいとおもいます。


Swiftソース・コードのご提供、詳細なご指導、ありがとうございました。

2019/06/02 05:45 mNeji への返信

もしかして、同一タグ (同名&同色) を重複設定したいということですか?そうなら当方の Finder でもできませんよ。また、Finder と挙動を揃えるために、スクリプトでもあえて重複しないようにしてます。


JXA

Array.from(new Set(tags))


PyObjC

sorted(set(tags), key = tags.index)


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


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

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

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