MacOS - полное удаление приложения с помощью командной строки
При установке нового приложения не из AppStore, в системных директориях создаётся множество файлов. Дополнительные файлы также создаются при запуске приложения - конфигурации, логи и т.д. и т.п.
При удалении таких приложений, все эти дополнительные файлы остаются в системе в виде "мусора".
Для удаления таких "мусорных" файлов существует множество специализированных программ (например CleanMyMac), но тоже самое можно сделать с помощью bash-скрипта.
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
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 строке.