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 |
Author
Excellent! Thanks for updating this
@inoperable My pleasure! Thank you for providing this script in the first place.
One thing I didnt seen before /usr/env/bash could be trouble since Apple dropped bash in favour of zsh (unless that changed back, I dropped macOS since Apple Silicon showed up - main reason being economics)
exportig exporting
#!/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
I've added a line to create a zip file of the
defaultsdirectory, so that it's easy to move it between macOS systems:And here's the corresponding
defaults-import.sh:The import script requires the path to the zip file as first parameter.
E.g.
defaults-import.sh ~/Downloads/defaults.zip