• Mac OS - Suche nach TAGS (bestimmte Anzahl)

    Ich hab hier mehrere Ordner mit vielen Dateien. Einige von diesen sind mit TAGS gekennzeichnet. Alle Daten mit z.B. einem "roten Tag" zu finden kein Problem.
    Es gibt aber Dateien die mit zwei oder drei Tags gekennzeichnet sind. Nicht einheitlich (z.B. rot - grün - gelb) sondern in unterschiedlichen Farbkombinationen.
    Kurz gefragt. Wie kann ich aus den Ordnern alle Dateien finden, die mit Drei Tags gekennzeichnet sind finden?
    • Mac OS - Suche nach TAGS (bestimmte Anzahl)

      So könntest Du es machen. Ich habe zum Testen einige Dateien in einem Ordner mit verschiedenen Tags versehen


      Die Taginformationen sind in kMDItemUserTags gespeichert.

      Wenn Du Dir mit mdls die Tags im Terminal ansiehst findest Du dort in der langen Liste alle Attribute auch die gesuchten.
      > mdls macfix\ 3\ Tags.png
      Show Plain Text
      1. kMDItemUserTags                     = (
      2.     Red,
      3.     Yellow,
      4.     Blue
      5. )

      Um nur dieses Attribut zu sehen, kannst Du die Ausgabe von mdls mit -name darauf einschränken:
      Show Plain Text
      1. mdls -name kMDItemUserTags -raw macfix\ 3\ Tags.png
      2. (
      3.     Red,
      4.     Yellow,
      5.     Blue
      6. )


      Ein kleiner Test zeigt, daß durch die Klammern vor/nach den einzelnen Tags, die Ausgabe immer zwei Zeilen mehr hat, als Tags vergeben sind:
      Show Plain Text
      1. for i in * ; do mdls -name kMDItemUserTags "$i" | echo "$(wc -l) $i" ; done
      2.        1 macfix 0 Tags.png
      3.        3 macfix 1 Tag.png
      4.        4 macfix 2 Tags A.png
      5.        4 macfix 2 Tags B.png
      6.        5 macfix 3 Tags A.png
      7.        5 macfix 3 Tags B.png
      8.        5 macfix 3 Tags C.png

      Eine Ausnahme gibt es bei 0 Tags da dort nur (null) ausgegeben wird.

      Wenn Du Dich in dem Verzeichnis mit den ganzen Dateien befindest, erhältst Du mit
      Show Plain Text
      1. for i in * ; do if [[ $(mdls -name kMDItemUserTags "$i" | wc -l) -eq 5 ]]; then echo "$i" ; fi ; done


      die gewünschte Ausgabe. Nur Dateien mit genau 3 Tags werden ausgegeben, da auf ist gleich 5 (3 Tags + 2 Zeilen für die Klammern) verglichen wird.
      Show Plain Text
      1. macfix 3 Tags A.png
      2. macfix 3 Tags B.png
      3. macfix 3 Tags C.png


      An der Stelle nach dem then kannst Du mit der gefundenen Datei weiterarbeiten, der Dateiname befindet sich in $i. Du kannst sie kopieren, umbenennen oder was Du eben machen möchtest.
      • Einfacher und schneller

        Annahme: Die Dateien liegen in Ordnern in Deinem Userordner unter "Bilder", die gefunden Dateien werden in einen Ordner "dreitags" auf dem Desktop kopiert.

        Falls das so für Dich paßt, ist es schnell gemacht:
        Terminal öffnen, die Zeile einkopieren, Return drücken, fertig

        Durch das Kopieren verlierst Du nichts und bei APFS kostet auch nicht Speicher.

        Die Suche erfolgt mit mdfind direkt im Spotlight Index, es werden nur die näher angesehen, die mindestens ein Tag haben.

        Show Plain Text
        1. IFS=$'\n' tags=($(mdfind -onlyin "$HOME/Pictures" "kMDItemUserTags == '*'")) ; unset IFS ; mkdir -p "$HOME/Desktop/dreitags" ; for i in "${tags[@]}" ; do az=$(mdls -name kMDItemUserTags "$i" | wc -l) ; if  [[ $az -eq 5 ]]; then cp "$i" "$HOME/Desktop/dreitags"; fi ; done

        • Wenn Deine Dateien woanders liegen -onlyin "$HOME/Pictures" anpassen
        • wenn es mehr oder weniger als drei Tags sein sollen -eq 5 anpassen (5 , weil es wieder die Anzahl der Tags + 2 wie heute Mittag ist s.o.)
        • wenn die woanders hinkopiert werden sollen "$HOME/Desktop/dreitags" anpassen,
        • wenn etwas anderes mit den Dateien gemacht werden soll z.B. umbenennen, dann cp "$i" "$HOME/Desktop/dreitags" anpassen


        Nur zur besseren Übersicht das Gleiche wie oben auf mehrere Zeilen aufgeteilt, dann findest Du die entsprechenden Stellen oben leichter
        Show Plain Text
        1. IFS=$'\n'
        2.     tags=($(mdfind -onlyin "$HOME/Pictures" "kMDItemUserTags == '*'"))
        3. unset IFS
        4. mkdir -p "$HOME/Desktop/dreitags"
        5.  
        6. for i in "${tags[@]}"; do
        7.     az=$(mdls -name kMDItemUserTags "$i" | wc -l)
        8.     if [[ $az -eq 5 ]]; then
        9.         cp "$i" "$HOME/Desktop/dreitags"
        10.     fi
        11. done
    • Ohne Script, ganz einfach »zu Fuß«

      Ist natürlich die Frage, wie »mit vielen Dateien« zu definieren ist, aber vielleicht kommste ja schon klar, wenn Du Dir einfach die Tags-Spalte im Fenster aktivierst, die sich wie gewohnt sortieren lässt. Ich finde, man kann sehr leicht optisch erkennen, ob es Einer, Zweier oder Dreier-Kandidaten sind.

    • Vielen Dank für Eure Lösungsvorschläge

      ich werd das ganze mal mir in Ruhe anschauen.
      @ Sven: Die Ordner haben keine Tags, sondern die Dateien darin. Und es sollen ja mehrere Ordner durchsucht werden.
      • Die Ordner sind doch nur eine Testanordnung, klappt ja mit Dateien genauso

        Wie gesagt, das »viel« ja viel bedeuten kann, ist es schwer die Situation einzuschätzen.

        Ich kann ja nur für mich sprechen, aber wenn es um eine einmalige Aktion mit zehn bekannten Ordnern geht, in denen ein paar hundert Dateien stecken, dann bin ich auf diesem Weg schneller fertig, als ich irgendwelche Befehle in die Konsole eingehackt habe.
        Stellte sich die Aufgabe für mich hingegen häufiger, würde ich natürlich mit dem Script o.ä. beschäftigen.