Skip to content

Instantly share code, notes, and snippets.

@inoperable
Last active December 27, 2025 18:42
Show Gist options
  • Select an option

  • Save inoperable/6041a6cc9426043bb830f4f4ed658449 to your computer and use it in GitHub Desktop.

Select an option

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
#!/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
@neomafo88
Copy link

#!/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