mac os
August 15, 2023

MacOS - полное удаление приложения с помощью командной строки

ТехнологииБольше по теме

При установке нового приложения не из AppStore, в системных директориях создаётся множество файлов. Дополнительные файлы также создаются при запуске приложения - конфигурации, логи и т.д. и т.п.

При удалении таких приложений, все эти дополнительные файлы остаются в системе в виде "мусора".

Для удаления таких "мусорных" файлов существует множество специализированных программ (например CleanMyMac), но тоже самое можно сделать с помощью bash-скрипта.

Создадём скрипт uninstall.sh:

vim uninstall.sh

Добавляем команду в скрипт:

#!/bin/zsh
mdfind -name $1 | vipe | xargs -L 1 -I {} sudo rm -rf {}

Подробнее о том, как работают эти команды в разделе "Что внутри?" .

Устанавливаем необходимые утилиты:

brew install moreutils

Выдадем права на исполнение:

sudo chmod +x uninstall.sh

Проверим работу скрипта, удалим Fotor и все его файлы:

./uninstall.sh fotor

Скрипт отыщет все файлы связанные с "fotor" и выведет их в виде списка в текстовом редакотре.

"Ложноположительные" результаты можно удалить, а все, что останется в списке, после сохранения и закрытия редактора будет удалено.

Список файлов на удаление.
Запрос пароля для удаления файлов.

Опционально (для oh-my-zsh):

Перенесем в директорию ~/.oh-my-zsh/custom/plugins и переименуем в uninstall.plugin.zsh:

cp uninstall.sh ~/.oh-my-zsh/custom/plugins/uninstall.plugin.zsh

и создадим алиас uninstall:

tee -a ~/.oh-my-zsh/custom/aliases.zsh <<< "alias uninstall='~/.oh-my-zsh/custom/plugins/uninstall.plugin.zsh '"

Что внутри?

Разберем работу составной команды:

mdfind -name $1 | vipe | xargs -L 1 -I {} sudo rm -rf {}

Команда mdfind - поиск файла по всей системе.
Опция -name - поиск по паттерну регулярного выражения.

Поищем какое-нибудь приложение, например Fotor:

mdfind -name fotor
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Log/log_fotor_2023-08-13.log
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/CrashReporter/Fotor Photo Editor_8849F9C3-EFAA-5B67-88FA-58968D2A811E.plist
/Users/air/Library/Application Support/CrashReporter/Fotor Photo Editor_8849F9C3-EFAA-5B67-88FA-58968D2A811E.plist
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/tools/fotor-desktop-bridge.js
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/static/media/fotor_blog_tv.761cd099.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/pwa/favicon/browserl-fotor-72.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/pwa/favicon/browserl-fotor-96.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/pwa/favicon/browserl-fotor-48.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/pwa/favicon/browserl-fotor-36.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/pwa/favicon/browserl-fotor-192.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Design/202212301352/design/project/pwa/favicon/browserl-fotor-144.png
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Texture/radiance.texture.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Texture/emulsion.texture.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/HDRStyle/saturated.style.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/HDRStyle/structured.style.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/HDRStyle/transparent.style.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/oldschool.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/holiday.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Texture/gradient.texture.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/lovers.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/borders.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/gallery.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/styled.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/floral.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/warmwinter.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/stamp.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/simple.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Border/artico.frame.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/mellow_2.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/groovy.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/spring.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/returned.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/filmatic.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor/Resources/Effect/artistic.effect.photosdk.everimaging.com/fotor_resource.md5
/Users/air/Library/Containers/com.everimaging.fotormac/Data/Library/Application Support/everimaging/Fotor
/Applications/Fotor Photo Editor.app
/Users/air/Library/Application Scripts/com.everimaging.fotormac

Найдены все файлы приложения Fotor в системе.

Команда vipe позволяет редактировать пайплайн в между двумя командами в текстовом редакторе.
Общая схема работы команды:

command1 | vipe | command2

vipe получает вывод первой команды command1 и передаёт в текстовый редактор (тот, который в системе по умолчанию: vi, vim, neovim, nano, emacs итд итп). После закрытия текстового редактора - передает содержимое второй команде command2.

В примере ниже, команда найдет все файлы приложения Fotor, откроет найденные файлы в редакторе и после его закрытия сохранит все в текстовом файле:

mdfind -name fotor | vipe | tee fotorfiles.txt

Команда vipe не входит в состав стандартных и устанавливается из homebrew:

brew install moreutils

Команда xargs - получает вывод из пайплайна и передает его как аргумент следующей команде. Полезно, когда команда не принимает стандартный ввод stdin, напимер echo:

echo 1 2 3 4 5 | echo
#ничего не выводит т.к. echo не работает с stdin
echo 1 2 3 4 5 | xargs echo
#1 2 3 4 5

Для примера создадим список файлов в тестовой папке и удалим файлы передав список в качестве аргумента:

mkdir test && cd test
touch file_{1..4}

Файлы в тестовой папке:

ls
"""
$ file_1 file_2 file_3 file_4
"""

Создадим список:

ls > list.txt

Прочитаем из файла list.txt и передадим на удаление:

cat list.txt | xargs -L 1 -I {} rm -r {}

Файлы удалены (включая файл со списком).
Опция -L 1 - обрабатывать по 1 строке.

ТехнологииБольше по теме