Вопрос или проблема
Я хотел бы удалить папку на моем FTP-сервере, хостинга PureFtpd, в скрипте, чтобы автоматизировать эту задачу. У меня есть bash-скрипт, который выглядит так:
#!/bin/sh
HOST=myhost.com
USER=my-user
PASSWORD=my-password
ftp -inv $HOST <<EOF
user $USER $PASSWORD
cd /folder_A
ls
rmdir -r assets
bye
EOF
Сервер дает следующий отзыв:
Connected to myhost.com.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-Вы пользователь номер 1 из 160 разрешенных.
220-Местное время сейчас #####. Порт сервера: 21.
220-Это частная система - анонимный вход запрещен.
220-IPv6 соединения также приветствуются на этом сервере.
220 Вы будете отключены после 5 минут бездействия.
331 Пользователь my-user ОК. Требуется пароль.
230-Ваше использование полосы пропускания ограничено.
230 ОК. Текущая ограниченная директория - /
Тип удаленной системы - UNIX.
Используется бинарный режим для передачи файлов.
250 ОК. Текущая директория - /folder_A
200 Команда PORT выполнена успешно.
150 Подключение к порту 49849.
drwxr-xr-x 3 3012 my-user 3 Окт 8 07:29 .
drwxr-xr-x 11 3012 my-user 16 Окт 7 22:49 ..
drwxr-xr-x 3 3012 my-user 13 Окт 7 22:46 assets
226-Опции: -a -l
226 Всего 3 совпадения
550 Невозможно удалить директорию: Нет такого файла или директории.
221-До свидания. Вы загрузили 0 и скачали 0 килобайтов.
221 Выход.
Я понимаю, что папка “assets” не существует, но исследование в FileZilla показывает, что папка все еще присутствует.
Я пытался выполнить следующую команду без успеха:
rmdir -r /folder_A/assets
Многие поиски в Google не дали решения. Следующая идея – попробовать ChatGPT…
Ответ или решение
Для успешного удаления папки на FTP-сервере, работающем под управлением PureFTPd, необходимо учесть, что команда rmdir
используется только для удаления пустых каталогов. Если каталог содержит файлы или другие папки, вам потребуется использовать другой подход.
Следующий Bash-скрипт показывает, как выполнить удаление папки с использованием FTP-клиента:
#!/bin/sh
HOST=myhost.com
USER=my-user
PASSWORD=my-password
ftp -inv $HOST <<EOF
user $USER $PASSWORD
cd /folder_A
ls
# Включаем соответствующую команду для удаление не пустых папок
# Прежде чем удалить папку, нужно сначала удалить все её содержимое
mdelete assets/*
# Теперь удаляем саму папку, если она пуста
rmdir assets
bye
EOF
Объяснение
-
mdelete assets/: Команда
mdelete
используется для удаления всех файлов в папкеassets
. Если в папке есть подкаталоги, вам нужно будет повторить эту команду для каждого из них, вручную или с помощью рекурсивного подхода. Обратите внимание, что в некоторых FTP-клиентах может потребоваться подтверждение для удаления. -
rmdir assets: После того как папка будет пустой, используйте команду
rmdir
для её удаления.
Потенциальные проблемы и решения
- Если у вас есть подкаталоги в папке
assets
, вам нужно будет удалить их так же. - Если ваш FTP-сервер не поддерживает
mdelete
, вам может потребоваться использовать другой инструмент (например, lftp) или сделать это через SFTP, если такой доступ возможен. - Если у вас установлены права доступа, убедитесь, что у пользователя есть полномочия на удаление файлов и папок.
Альтернативные подходы
Если вам нужно удалить папку с вложенными файлами и подкаталогами, рассмотрите возможность использования SFTP, который предлагает более мощные команды и функции для работы с файлами. Например, вот как это можно сделать с помощью lftp:
#!/bin/sh
HOST=myhost.com
USER=my-user
PASSWORD=my-password
lftp -u $USER,$PASSWORD $HOST <<EOF
rm -r /folder_A/assets
bye
EOF
С помощью lftp команда rm -r
будет рекурсивно удалять папку, включая все файлы и подкаталоги.
Заключение
Удаление папки на FTP-сервере требует внимания к деталям, таким как наличие файлов и подкаталогов. Следуйте этому подходу, и вы сможете автоматизировать удаление папок с помощью Bash-скриптов. Удачи!