Очистка файлов в приложении службы Linux, нужно исключить папку.

Вопрос или проблема

Я хочу удалить файлы на моем сервисе приложений перед развертыванием, чтобы убедиться, что присутствуют последние файлы. Однако мне нужно исключить одну папку.

Я добавил -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 {} +

Объяснение

  1. -mindepth 1: это условие гарантирует, что команда обратится ко всем элементам, кроме корневого каталога (.).
  2. -not -path "./webroot/uploads/*": это условие исключает папку webroot/uploads и все её содержимое.
  3. -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. Убедитесь в том, что вы тестируете команды в безопасной среде, прежде чем применять их на рабочем сервисе, чтобы избежать нежелательных удалений данных.

Оцените материал
Добавить комментарий

Капча загружается...