Last active
December 27, 2025 18:42
-
-
Save inoperable/6041a6cc9426043bb830f4f4ed658449 to your computer and use it in GitHub Desktop.
export defaults for all domains in macOS into separate .plist files for editing and importing, files are written into $HOME/defaults
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env zsh | |
| function exportDefaults { | |
| local outdir="$HOME/defaults" | |
| local outdirApple="$outdir/apple" | |
| local outdirUser="$outdir/user" | |
| local outdirGlobal="$outdir/global" | |
| local filesdone=0 | |
| local filecount=0 | |
| local filestotal=0 | |
| local globals=0 | |
| function cleanOutdirs { | |
| [[ ! -d $HOME/defaults ]] && mkdir "$HOME/defaults" | |
| if [[ -d $outdirApple ]]; then | |
| echo "removing all files in $outdirApple" | |
| rm -rf "${outdirApple/*}" | |
| else | |
| mkdir "$outdirApple" | |
| fi | |
| if [[ -d $outdirUser ]]; then | |
| echo "removing all files in $outdirUser" | |
| rm -rf "${outdirUser/*}" | |
| else | |
| mkdir "$outdirUser" | |
| fi | |
| if [[ -d $outdirGlobal ]]; then | |
| echo "removing all files in $outdirGlobal" | |
| rm -rf "${outdirGlobal/*}" | |
| else | |
| mkdir "$outdirGlobal" | |
| fi | |
| } | |
| function exportDomains { | |
| filesdone=0 | |
| filecount=0 | |
| for domain in "${domains[@]}"; do | |
| plist="${domain//,/}.plist" | |
| if [[ $globals == 0 ]]; then | |
| if [[ $domain =~ com.apple ]]; then | |
| defaults export "$domain" "$outdirApple/$plist" | |
| #echo "writing $plist to $outdirApple" | |
| filecount=$((filecount+1)) | |
| else | |
| defaults export "$domain" "$outdirUser/$plist" | |
| #echo "writing $plist to $outdirUser" | |
| filecount=$((filecount+1)) | |
| fi | |
| else | |
| sudo defaults export "$domain" "$outdirGlobal/$plist" | |
| #echo "writing $plist to $outdirGlobal" | |
| filecount=$((filecount+1)) | |
| fi | |
| filesleft=$((filesleft-1)) | |
| filesdone=$((filesdone+1)) | |
| echo -ne "[ $filesdone/$filesleft ] \r" | |
| done | |
| } | |
| cleanOutdirs | |
| # ------------------------------------------------- | |
| local domains=($(defaults domains)) | |
| local filesleft=${#domains[@]} | |
| echo "USER namespace has ${#domains[@]} domains, exportig..." | |
| exportDomains | |
| echo "written $filecount files in $outdir" | |
| local filestotal=$((filestotal+filecount)) | |
| # ------------------------------------------------- | |
| globals=1 | |
| # ------------------------------------------------- | |
| local domains=($(sudo defaults domains)) | |
| local filesleft=${#domains[@]} | |
| echo "GLOBAL namespace has ${#domains[@]} domains, exportig..." | |
| exportDomains | |
| echo "written $filecount files in $outdir" | |
| local filestotal=$((filestotal+filecount)) | |
| # ------------------------------------------------- | |
| sudo chown -R "$(whoami)":staff "$HOME/defaults" | |
| local timed="$((SECONDS / 3600))hrs $(((SECONDS / 60) % 60))min $((SECONDS % 60))sec" | |
| echo "exported $filestotal files in $timed" | |
| } | |
| exportDefaults |
#!/bin/bash
function exportDefaultDomain {
local outdir="${HOME}/Downloads/default_domain"
local filecount=0
local files_ok=0
local files_total=0
local globals=0
function exportDomains {
files_ok=0
filecount=0
for domain in "${domains[@]}"; do
[[ $domain =~ ^[[:alnum:]] ]] || continue
plist="${domain}.plist"
if [[ $globals == 0 ]]; then
if [[ $domain =~ com.apple ]]; then
defaults export "${domain}" "${outdir}/Apple/${plist}"
echo "${plist} → ${outdir}"
filecount=$((filecount+1))
else
defaults export "${domain}" "${outdir}/User/${plist}"
echo "${plist} → ${outdir}"
filecount=$((filecount+1))
fi
else
sudo defaults export "${domain}" "${outdir}/Global/${plist}"
echo "${plist} → ${outdir}"
filecount=$((filecount+1))
fi
files_remaining=$((files_remaining-1))
files_ok=$((files_ok+1))
echo -ne "[ ${files_ok}/${files_remaining} ]\r"
done
}
mkdir -p "${outdir}"
mkdir -p "${outdir}/Apple"
mkdir -p "${outdir}/User"
mkdir -p "${outdir}/Global"
local domainsWithSeparator="$(defaults domains)"
local domains=(${domainsWithSeparator//,/})
local files_remaining=${#domains[@]}
echo "USER namespace: ${#domains[@]} domain(s)"
exportDomains
echo "USER namespace: ${filecount} file(s)"
local files_total=$((files_total+filecount))
globals=1
local domainsWithSeparator="$(sudo defaults domains)"
local domains=(${domainsWithSeparator//,/})
local files_remaining=${#domains[@]}
echo "GLOBAL namespace: ${#domains[@]} domain(s)"
exportDomains
echo "GLOBAL namespace: ${filecount} file(s)"
local files_total=$((files_total+filecount))
sudo chown -R "$(whoami)":staff "${outdir}" \
&& (cd "${outdir}" && zip -qr "../default_domain.zip" . -x '*/.DS_Store') \
&& rm -rf "${outdir}"
local timed="$((SECONDS / 3600))hrs $(((SECONDS / 60) % 60))min $((SECONDS % 60))sec"
echo "${files_total} file(s) ~ ${timed}"
}
exportDefaultDomain
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
exportigexporting