Удалить `целевые` папки во всех подпапках.

Этого я и ожидал. Чтобы прослушивать привилегированный порт, процесс должен быть запущен с привилегиями root. Но как только пользователь подключен, мы хотим, чтобы этот процесс выполнялся с привилегиями подключенного пользователя.Если серверный процесс просто сбросит свои привилегии, он не сможет обслужить запрос от другого пользователя. Существует также проблема, заключающаяся в том, что сервер должен обрабатывать несколько подключений одновременно. Итак, что происходит, так это то, что сервер (, работающий как root ), прослушивает сокет до тех пор, пока пользователь не подключится, а затем, чтобы позволить ему обрабатывать другие запросы и работать с правильным уровнем привилегий, он разветвляется, создавая 2 экземпляра.. Один экземпляр возвращается к прослушиванию соединений, другой переключается на менее привилегированного пользователя. Оба имеют копию дескриптора, ссылающегося на соединение сокета.

Если один из процессов закроет сокет, то, в отличие от двух процессов, обращающихся к одному и тому же файлу, соединение будет потеряно.

0
22.11.2019, 13:04
2 ответа

РЕДАКТИРОВАТЬ:

судя по комментариям к этому вопросу, лучше полностью использовать широкий функционал команды findи вообще пропустить конвейер (также указать findне спускаться в каталог, который он собирается запросить rmудалить):

find. -type d -name target -prune -exec rm -r {} +

Должно сработать.

Приносим извинения за неудовлетворительный ответ. Ваш отзыв был очень информативным.


Оригинальный ответ:

Немного погуглив -fu to список всех подкаталогов и канал в rm:

find. -type d | grep -E '/target$' | xargs rm -r

Должно работать. Прежде чем удалять папки, проверьте, дает ли find. -type d | grep -E '/target$'ожидаемый результат! Лучше спастись, чем сожалеть.

1
28.01.2020, 02:21

Если вы знаете, что у вас не будет более нескольких тысяч этих targetкаталогов, вы можете установить параметры оболочки globstarи dotglobв bashс помощью

shopt -s globstar dotglob

, а затем используйте

rm -rf./**/target/

Это приведет к удалению любого каталога с именем targetв текущем каталоге или ниже него. Косая черта в конце имеет решающее значение, поскольку в противном случае шаблон может соответствовать вещам, которые не являются каталогами.

Шаблон **активируется установкой параметра оболочки globstarи «рекурсивно» сопоставляется с подкаталогами. Поскольку dotglobтакже установлен, это найдет каталоги с именем targetв скрытых подкаталогах, а также (точно так же, как findсделал бы ).

В macOS по умолчаниюbashслишком стар для поддержки опции оболочки globstar, поэтому вы можете установить самую последнюю bashс помощью Homebrew или переключиться на zsh(, который в настоящее время является оболочкой по умолчанию для новых учетных записей пользователей macOS ).

С помощью zshэту операцию можно выполнить с помощью

.
rm -rf./**/target(/D)

Где (/D)означает «соответствовать только каталогам и включать скрытые каталоги». Глоб **включен по умолчанию в zsh.


Сfind:

find. -depth -type d -name target -exec rm -rf {} +

Это найдет все targetкаталоги, расположенные в текущем каталоге или ниже, а затем вызовет rm -rfкак можно больше из них за раз, чтобы удалить их. Опция -depthзаставляет findвыполнять глубинный -первый поиск (мы хотим, чтобы это не пыталось искать каталоги, которые мы только что удалили ).

Эту команду вы бы использовали, если бы использовали shв качестве оболочки (, которая не имеет **), или если у вас много тысяч таких каталогов.

Даже если у вас есть большое количество каталогов target, вы все равно сможете удалить их один за другим с помощью

for dirpath in./**/target/; do
    rm -rf "$dirpath"
done

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

3
28.01.2020, 02:21

Теги

Похожие вопросы