Terminal komutuyla mavericks içindeki bir dosyayı veya klasörü etiketlemek mümkün müdür?
Terminal komutuyla mavericks içindeki bir dosyayı veya klasörü etiketlemek mümkün müdür?
Yanıtlar:
Xattr kullanabilirsiniz. Bu, etiketleri dosya1'den dosya2'ye kopyalar:
xattr -wx com.apple.metadata:_kMDItemUserTags "$(xattr -px com.apple.metadata:_kMDItemUserTags file1)" file2;xattr -wx com.apple.FinderInfo "$(xattr -px com.apple.FinderInfo file1)" file2
Etiketler, özellik listesinde tek bir dizgi dizisi olarak saklanır:
$ xattr -p com.apple.metadata:_kMDItemUserTags file3|xxd -r -p|plutil -convert xml1 - -o -
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<string>Red
6</string>
<string>new tag</string>
<string>Orange
7</string>
<string>Yellow
5</string>
<string>Green
2</string>
<string>Blue
4</string>
<string>Purple
3</string>
<string>Gray
1</string>
</array>
</plist>
Com.apple.FinderInfo içindeki kColor bayrağı ayarlanmamışsa, Finder renkler için daireler göstermez. KColor bayrağı turuncuya ayarlanmışsa ve dosyada kırmızı etiket varsa, Finder hem kırmızı hem de turuncu daireleri gösterir. AppleCoin ile kColor bayrağını ayarlayabilirsiniz:
xattr -w com.apple.metadata:_kMDItemUserTags '("Red\n6","new tag")' ~/desktop/file4;osascript -e 'on run {a}' -e 'tell app "Finder" to set label index of (POSIX file a as alias) to item 1 of {2, 1, 3, 6, 4, 5, 7}' -e end ~/desktop/file4
xattr -p com.apple.FinderInfo file|head -n1|cut -c28-29
kColor bayrağı için kullanılan bitlerin değerini yazdırır. Kırmızı C, turuncu E, sarı A, yeşil 4, mavi 8, macenta 6 ve gri 2'dir. Değerlere 1 ekleyecek olan bayrak OS X'te kullanılmaz.
Düzenle: etiketini de kullanabilirsiniz :
tag -l file # list
tag -a tag1 file # add
tag -s red,blue file # set
tag -r \* file # remove all tags
tag -f green # find all files with the green tag
tag -f \* # find all files with tags
tag -m red * # match (print files in * that have the red tag)
etiketiyle monte edilebilir brew install tag
veya sudo port install tag
.
$ tag -h
tag - A tool for manipulating and querying file tags.
usage:
tag -a | --add <tags> <file>... Add tags to file
tag -r | --remove <tags> <file>... Remove tags from file
tag -s | --set <tags> <file>... Set tags on file
tag -m | --match <tags> <file>... Display files with matching tags
tag -l | --list <file>... List the tags on file
tag -f | --find <tags> Find all files with tags
<tags> is a comma-separated list of tag names; use * to match/find any tag.
additional options:
-v | --version Display version
-h | --help Display this help
-n | --name Turn on filename display in output (default)
-N | --no-name Turn off filename display in output (list)
-t | --tags Turn on tags display in output (find, match)
-T | --no-tags Turn off tags display in output (list)
-g | --garrulous Display tags each on own line (list, find, match)
-G | --no-garrulous Display tags comma-separated after filename (default)
-H | --home Find tagged files only in user home directory
-L | --local Find tagged files only in home + local filesystems (default)
-R | --network Find tagged files in home + local + network filesystems
-0 | --nul Terminate lines with NUL (\0) for use with xargs -0
Etiketleri saf bash komutlarıyla değiştirmek mümkündür. Üçüncü taraf "tag" utiline gerek yoktur.
Bu komut bir dosyanın tüm etiketlerini listeler ($ src):
xattr -px com.apple.metadata:_kMDItemUserTags "$src" | \
xxd -r -p - - | plutil -convert json -o - - | sed 's/[][]//g' | tr ',' '\n'
Ve bir dosyaya ($ src) nasıl etiket ($ newtag) ekleyeceğiniz aşağıda açıklanmıştır:
xattr -wx com.apple.metadata:_kMDItemUserTags \
"$(xattr -px com.apple.metadata:_kMDItemUserTags "$src" | \
xxd -r -p - - | plutil -convert json -o - - | sed 's/[][]//g' | tr ',' '\n' | \
(cat -; echo \"$newtag\") | sort -u | grep . | tr '\n' ',' | sed 's/,$//' | \
sed 's/\(.*\)/[\1]/' | plutil -convert binary1 -o - - | xxd -p - -)" "$src"
İşte "tags" işlevini veren küçük bir kabuk betiği. Kullanımı:
tags <file>
Lists all tags of a file
tags -add <tag> <file>
Adds tag to a file
İşlev, kaldırmayı da desteklemek için kolayca genişletilebilir.
tags() {
# tags system explained: http://arstechnica.com/apple/2013/10/os-x-10-9/9/
local src=$1
local action="get"
if [[ $src == "-add" ]]; then
src=$3
local newtag=$2
local action="add"
fi
# hex -> bin -> json -> lines
local hexToLines="xxd -r -p - - | plutil -convert json -o - - | sed 's/[][]//g' | tr ',' '\n'"
# lines -> json -> bin -> hex
local linesToHex="tr '\n' ',' | echo [\$(sed 's/,$//')] | plutil -convert binary1 -o - - | xxd -p - -"
local gettags="xattr -px com.apple.metadata:_kMDItemUserTags \"$src\" 2> /dev/null | $hexToLines | sed 's/.*Property List error.*//'"
if [[ $action == "get" ]]; then
sh -c "$gettags"
else
local add="(cat -; echo \\\"$newtag\\\") | sort -u"
local write="xattr -wx com.apple.metadata:_kMDItemUserTags \"\$($gettags | $add | grep . | $linesToHex)\" \"$src\""
sh -c "$write"
fi
}
export -f tags
xattr -wx
dosya zaten üzerinde herhangi etiketine sahip değil iken komut başarısız olur. Bundan nasıl kaçınabilirim?
xattr -px …
Klasörlerimden birinde etiketleri göstermek için verdiğiniz komutu çalıştırmak şu çıktıyı verir: "language:Objective-C\n2"
(yeni satır) "platform:iOS\n4"
. Dürüst olmak gerekirse, orta derecede karmaşık kabuk kodunuzu bir bash işlevine sarılacaksanız, topluluğun bakımlı olması avantajına sahip olan etiket çabasını çoğaltıyorsunuz.