Skip to content

Instantly share code, notes, and snippets.

@gabrielfalcao
Created August 11, 2026 02:27
Show Gist options
  • Select an option

  • Save gabrielfalcao/171a0bc35b40791bf3d48ff085b70999 to your computer and use it in GitHub Desktop.

Select an option

Save gabrielfalcao/171a0bc35b40791bf3d48ff085b70999 to your computer and use it in GitHub Desktop.
Disable mdstores in MacOS, globally and for every mounted volume and stop the generation of .DS_Store files
#!/usr/bin/env bash
set -umeTE
set +f
set -o pipefail
export IFS=$'\n'
declare -- script_name="$(basename "${BASH_SOURCE[0]}")"
declare -- script_path="$(2>/dev/random 1>/dev/random cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
declare -- this_script_path="${script_path}/${script_name}"
on_exit() {
set +x
}
on_ctrlc() {
local -- msg="Aborted with Ctrl-C"
1>&2 echo -e "\r\x1b[A${msg}"
exit 130
}
trap on_exit exit
trap on_ctrlc hup
trap on_ctrlc int
trap on_ctrlc bus
trap on_ctrlc segv
trap on_ctrlc sys
declare -a argv=(${@})
declare -i argc=${#argv[@]}
declare -- arg=""
declare -- argument=""
declare -- field=""
declare -- key=""
declare -- line=""
declare -- name=""
declare -- url=""
declare -- param=""
declare -- device=""
declare -- bytes_used=""
declare -- bytes_free=""
declare -- path=""
declare -- pos=""
declare -- value=""
declare -i code=0
declare -i current=0
declare -i index=0
declare -i skip=0
declare -- filename=""
declare -- filename_extension=""
declare -- filename_base=""
declare -a volumes=()
declare -A volumes_path_by_path=()
declare -A volumes_bytes_used_by_path=()
declare -A volumes_bytes_free_by_path=()
declare -A volumes_device_by_path=()
for line in $(df -h); do
path=$(sed -n -E 's/^([^[:space:]]+[[:space:]]+){5}([^[:space:]]+.*)/\2/gp' <<<"${line}")
if [ ! -e "${path}" ]; then
continue
fi
if [[ ! -v volumes_path_by_path["${path}"] ]]; then
volumes_path_by_path["${path}"]="${path}"
device=$(gawk '{ print $1 }' <<<"${line}")
bytes_used=$(gawk '{ print $3 }' <<<"${line}")
bytes_free=$(gawk '{ print $4 }' <<<"${line}")
volumes_device_by_path["${path}"]="${device}"
volumes_bytes_used_by_path["${path}"]="${bytes_used}"
volumes_bytes_free_by_path["${path}"]="${bytes_free}"
volumes+=("${path}")
fi
done
throw_error() {
1>&2 echo -e "\x1b[1;38;2;232;59;59m[\x1b[1;38;2;251;107;29m${script_name} \x1b[1;38;2;232;59;59merror]\x1b[0m \x1b[1;38;2;249;194;43m${@}\x1b[0m"
}
display_warning() {
1>&2 echo -e "\x1b[1;38;2;232;59;59m[\x1b[1;38;2;251;107;29m${script_name} \x1b[1;38;2;232;59;59mwarning]\x1b[0m \x1b[1;38;2;249;194;43m${@}\x1b[0m"
exit 1
}
run_mdutil() {
local -a argv=(${@})
local -i argc=${#argv[@]}
local -i code=0
1>&2 echo -e "\x1b[1;38;2;77;155;230mmdutil \x1b[1;38;2;143;211;255m${argv[@]}\x1b[0m"
if sudo mdutil ${argv[@]}; then
code=0
else
code=$?
fi
if [ ${code} -ne 0 ]; then
1>&2 echo -e "\x1b[1;38;2;240;79;120mcommand failed with code \x1b[1;38;2;232;59;59m${code}\x1b[1;38;2;240;79;120m: \x1b[1;38;2;249;194;43mmdutil \x1b[1;38;2;251;107;29m${argv[@]}\x1b[0m\n"
else
1>&2 echo -e "\x1b[1;38;2;30;188;115mcommand succeeded: \x1b[1;38;2;213;224;75mmdutil \x1b[1;38;2;251;255;134m${argv[@]}\x1b[0m\n"
fi
}
disable_at_path() {
local -a argv=(${@})
local -i argc=${#argv[@]}
local -a targets=()
local -- path=""
if [ ${argc} -eq 0 ]; then
throw_error "\x1b[1;38;2;249;194;43mfunction \x1b[1;38;2;240;79;120m${FUNCNAME[0]} \x1b[1;38;2;249;194;43mis missing argument: \x1b[1;38;2;246;129;129m<PATH>"
fi
if [ ${argc} -gt 1 ]; then
throw_error "\x1b[1;38;2;249;194;43mfunction \x1b[1;38;2;240;79;120m${FUNCNAME[0]} \x1b[1;38;2;249;194;43mreceived too many arguments (${argc}): \x1b[1;38;2;246;129;129m${argv[@]@Q}"
fi
if [ -d "${argv[@]}" ]; then
targets+=("${argv[@]}")
else
targets=( ${argv[@]} )
fi
for path in ${targets[@]}; do
run_mdutil -i off "${path}"
run_mdutil -d "${path}"
run_mdutil -E "${path}"
if [ -d "${path}" ]; then
run_mdutil -E -V "${path}"
run_mdutil -d -V "${path}"
run_mdutil -i off -V "${path}"
fi
done
}
main() {
for index in ${!argv[@]}; do
current=$((index + 1))
arg=${argv[${index}]}
if [ -d "${arg}" ]; then
volumes+=("${arg}")
elif [ -e "${arg}" ]; then
let ty=$(gstat -c %F "${arg}")
display_warning "ignoring argument ${current} of ${argc} (${arg@Q}) because ${ty} ${arg@Q} is not a directory"
else
display_warning "ignoring argument ${current} of ${argc} (${arg@Q}) because ${arg@Q} is not an existing file"
fi
done
for path in ${volumes[@]}; do
1>&2 echo -e "\x1b[1;38;2;48;225;185mdisabling mdstores at path \x1b[1;38;2;143;248;226m${path}\x1b[0m"
disable_at_path "${path}"
done
disable_at_path -a
}
if [ "${0}" == "${BASH_SOURCE[0]}" ]; then
main
else
1>&2 echo -e "${BASH_SOURCE[0]} appears to being used as a library by ${0@Q}"
fi
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment