Вопрос или проблема
Я хочу удалить файлы на моем сервисе приложений перед развертыванием, чтобы убедиться, что присутствуют последние файлы. Однако мне нужно исключить одну папку.
Я добавил -not -path
к тому, что работало, чтобы попытаться исключить папку. Однако файлы в webroot/uploads
все еще удаляются и не исключаются.
$bodyToPOST = @{
command = "find . -mindepth 1 -delete -not -path `"/home/site/wwwroot/webroot/uploads/*`""
dir = "/home/site/wwwroot"
}
# Объедините все параметры в $param
$param = @{
# команда REST API url
Uri = "https://$WebAppName.scm.omited.appserviceenvironment.net/api/command"
Headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
Method = "POST"
Body = (ConvertTo-Json $bodyToPOST)
ContentType = "application/json"
}
# Вызов REST-запроса
Invoke-RestMethod @param
Как я могу изменить этот скрипт, чтобы исключить папку webroot/uploads
из команды удаления?
Ответ или решение
Чтобы удалить файлы в приложении на Linux, исключив определённую папку, вам необходимо правильно сформулировать команду find
. Ваша текущая команда имеет небольшую ошибку в способе фильтрации папок, которые вы хотите исключить. Давайте рассмотрим, как вы можете это сделать корректно.
Проблема
Вы указали команду:
find . -mindepth 1 -delete -not -path "/home/site/wwwroot/webroot/uploads/*"
Эта команда предназначена для удаления всех файлов и папок в каталоге, кроме содержимого папки webroot/uploads
. Однако, специфика использования -not -path
подразумевает, что вы хотите исключить именно путь к папке. К сожалению, в данной команде -delete
не игнорирует результат фильтрации полностью.
Решение
Для правильного исключения определённой директории из операции удаления, лучше использовать конструкцию, добавляя соответствующее условие в find
. Следующий вариант будет работать корректно:
find . -mindepth 1 -not -path "./webroot/uploads/*" -exec rm -rf {} +
Объяснение
-mindepth 1
: это условие гарантирует, что команда обратится ко всем элементам, кроме корневого каталога (.
).-not -path "./webroot/uploads/*"
: это условие исключает папкуwebroot/uploads
и все её содержимое.-exec rm -rf {} +
: эта часть команды находит все оставшиеся элементы и удаляет их. Здесь{} +
используетfind
для передачи всех найденных файлов перед вызовомrm
, что делает выполнение более эффективным.
Полный скрипт на PowerShell
Вы можете внести изменения в ваш скрипт следующим образом:
$bodyToPOST = @{
command = "find . -mindepth 1 -not -path './webroot/uploads/*' -exec rm -rf {} +"
dir = "/home/site/wwwroot"
}
# Сгруппируйте все параметры в $param
$param = @{
# Команда REST API
Uri = "https://$WebAppName.scm.omited.appserviceenvironment.net/api/command"
Headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
Method = "POST"
Body = (ConvertTo-Json $bodyToPOST)
ContentType = "application/json"
}
# Выполняем REST вызов
Invoke-RestMethod @param
Резюме
Таким образом, с помощью корректировки команды find
вы сможете успешно удалить все файлы и каталоги, кроме указанной папки webroot/uploads
. Убедитесь в том, что вы тестируете команды в безопасной среде, прежде чем применять их на рабочем сервисе, чтобы избежать нежелательных удалений данных.