Created
August 11, 2026 02:27
-
-
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
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 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