From 9a88e9ff0385f66e7c565a394908503dc6e916ad Mon Sep 17 00:00:00 2001 From: neodarz Date: Fri, 28 Apr 2017 00:30:19 +0200 Subject: Site updated at 2017-04-28T00:29:42+02:00 source branch was at: f1965c50670f611ef54f9471490d45a554f7d866 Correct a link --- build/blog/2015-03-22-back-up-os-x-app-icons.html | 74 +++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 build/blog/2015-03-22-back-up-os-x-app-icons.html (limited to 'build/blog/2015-03-22-back-up-os-x-app-icons.html') diff --git a/build/blog/2015-03-22-back-up-os-x-app-icons.html b/build/blog/2015-03-22-back-up-os-x-app-icons.html new file mode 100644 index 00000000..e243c42f --- /dev/null +++ b/build/blog/2015-03-22-back-up-os-x-app-icons.html @@ -0,0 +1,74 @@ + + + + + + + +Back up OS X app icons + + + + + + + + + +
This blog has been archived.
Visit my home page at zhimingwang.org.
+ +
+
+

Back up OS X app icons

+ +
+

OS X application icons are valuable assets, and it's interesting to see how they evolve over time. This is especially the case when we upgraded to OS X 10.10 Yosemite, when Apple and many design-aware third party developers overhauled (mainly flattened) their icons.

+

However, we lose all the old icons when we do a major OS upgrade. Technically they still live in Time Machine backups, but those are a pain to pull out. Therefore, I wrote a script just now to back up app icons of all applications living in /Applications (including those symlinked to /Applications, e.g., apps installed through brew cask) and its level-one subdirectories, and /System/Library/CoreServices (for Finder.app and such). Here's the script:

+
#!/usr/bin/env bash
+function app_version
+{
+    # $1 is the path to the app
+    /usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "$1"/Contents/Info.plist 2>/dev/null || date +%Y%m%d
+}
+
+function app_icon_path
+{
+    # $1 is the path to the app
+    filename=$(/usr/libexec/PlistBuddy -c "print CFBundleIconFile" "$1"/Contents/Info.plist 2>/dev/null)
+    [[ -n ${filename} ]] || return
+    filename=$(basename "${filename}" .icns)
+    echo "$1/Contents/Resources/${filename}.icns"
+}
+
+function process_app
+{
+    # $1 is the path to the app
+    name=$(basename "$1" .app | tr -d ' ')
+    path=$(realpath -e "$1") || { echo "${RED}error: broken link '${path}'${RESET}" >&2; return 1; }
+    version=$(app_version "${path}")
+    icon_path=$(app_icon_path "${path}")
+    [[ -n ${icon_path} ]] || { echo "${YELLOW}warning: '$1' has no app icon${RESET}"; return 1; }
+    [[ -f ${icon_path} ]] || { echo "${RED}error: '${icon_path}' does not exist${RESET}" >&2; return 1; }
+    cp "${icon_path}" "${name}-${version}.icns"
+    echo "${name}-${version}.icns"
+}
+
+find /Applications -maxdepth 2 -name '*.app' | while read app; do process_app "${app}"; done
+find /System/Library/CoreServices -maxdepth 1 -name '*.app' | while read app; do process_app "${app}"; done
+

The script is also available as a gist.

+
+
+ + + -- cgit v1.2.1