find
очень полезно для выборочного выполнения действий над целым деревом.
find . -type f -name ".Apple*" -delete
Здесь -type f
он удостоверяется, что это файл, а не каталог, и может быть не совсем тем, что вам нужно, поскольку он также пропускает символические ссылки, сокеты и другие вещи. Вы можете использовать ! -type d
, что буквально означает не каталоги, но тогда вы также можете удалить символьные и блочные устройства. Я бы посоветовал взглянуть на -type
предикат на странице руководства find
.
Чтобы сделать это строго с подстановочным знаком, вам нужна расширенная поддержка оболочки. Bash v4 имеет globstar
опцию , которая позволяет вам рекурсивно сопоставлять подкаталоги, используя **
. zsh
а ksh
также поддерживать эту модель. Используя это, вы можете сделать rm -rf **/.Apple*
. Это не стандарт POSIX и не очень переносимый, поэтому я бы не использовал его в скрипте, но для одноразового действия интерактивной оболочки это нормально.
find . -type d -name .Apple*
к работе - в нем перечислены все папки. Тем не менее, это не удается, когда я добавляю-delete
в конце. Это просто возвращается с кратким описанием использования. Он работает на BusyBox v1.1.1. Это имеет значение?-delete
тоже не POSIX.**
был введенzsh
в начале 90-х годов. Это теперь (в хронологическом порядке появления) также в ksh93, fish, bash и tcsh.rm -rf **/.Apple*
-delete
не работает, используйте-exec rm -f {} +
вместо этого.find
быть многословным, когда он удаляет? Я полагаю, что метод "globstar" сделает это, добавив-v
переключатель.Я столкнулся с проблемами при использовании
find
с-delete
из-за преднамеренного поведенияfind
(то есть отказ от удаления, если путь начинается с ./, что они делают в моем случае), как указано на его странице руководства:Вместо этого я смог просто сделать
В вашем случае кажется, что указание на глобус (звездочка, *) было решением, но я хотел бы предоставить свой ответ на случай, если у кого-то еще возникнет подобная проблема.
ПРИМЕЧАНИЕ. Ранее мой ответ заключался в следующем: @Wildcard указал на недостатки безопасности в комментариях.
источник
xargs
здесь.-exec rm -r {} \;
или, что лучше,-exec rm -r {} +
будет делать то же самое без ошибок в именах специальных символов. См. Почему циклическая обработка вывода find является плохой практикой?mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
в своем каталоге и затем повторите ту же команду, если не уверены, что существует вероятность потери данных. Или, поскольку речь идет о Mac OSmkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
. ( Предупреждение: вы БУДЕТЕ удалить все свои файлы, если сделаете это. Это моя точка зрения.)Возможно, что в вашей команде rm / find нет ничего плохого, но пользователь, с которым вы вошли, на самом деле не имеет прав на удаление. Использование
ls -l
в список вещей , с их разрешения, и вы можете определить , кто вы сid
иgroups
команды (или должны быть доступны). Если вы «неправильный пользователь» для этого, вам нужно будет либо изменить права доступа / владельца файлов, либо переключиться на другого пользователя.источник
Пытаться:
источник
dotglob
здесь бесполезно. Смотрите эту страницу для примера того, что делает dotglob.Простая команда:
Удачи!
источник