При запуске этой команды:
$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/
Я получаю следующий результат:
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor
Из чтения man rsync
у меня сложилось впечатление, что --force
опция укажет rsync удалить эти непустые каталоги, что является желаемым результатом.
Ссылка:
--force force deletion of dirs even if not empty
Как изменить команду для удаления непустых каталогов?
Я использую rsync версии 3.0.8 в Gentoo Base System Release 2.0.3, если это актуально.
Обновить: Добавлено sudo
к команде, чтобы прояснить, что это не проблема с правами доступа к файлу.
Вы пытались добавить --delete-excluded
?
Если вы удалите каталог в исключенных папках на "удаленной" стороне, rsync --delete
не удалит исключенную папку на вашем «локальном» сайте.
Вот возможные источники этой проблемы:
(1) Эта ошибка может быть результатом -b (--backup) вариант. Эта опция создаст резервную копию каждого удаленного файла, добавив тильду (~) в имени файла. (Это меня смутило, поскольку имя файла явно является резервной копией, а имя каталога - нет, поскольку вы не видите тильду.)
Чтобы проверить, является ли это тем же случаем, прочтите свой целевой каталог на самом глубоком уровне и проверьте, есть ли какой-либо конечный файл тильды (~). Обратите внимание, что эти имена файлов с добавлением тильды невидимы в некоторых распространенных системах просмотра файлов, поэтому вы можете их не видеть.
Чтобы решить эту проблему, используйте параметр --backup-dir = DIR, например --backup-dir = .rsync_bak.
(2) Опция --exclude может дать такие же результаты. Что, возможно, происходит в вашем случае. Система шаблонов мощная, но может вводить в заблуждение. Например, если вы напишете --exclude = '* ~', это пропустит все файлы с окончанием тильды, что приведет к тому же результату, что и в случае (1) выше.
из справочной страницы rsync:
если шаблон начинается с /, тогда он привязан к определенному месту в иерархии файлов, в противном случае он сопоставляется с концом имени пути
Si, если вы напишете --exclude = uploads, это исключит все файлы с именем «updloads» в любой уровень вашего дерева файлов.
Проверьте, есть ли в ваших каталогах, которые невозможно удалить, файл с именем "uploads".
Решением было бы изменить "--exclude = uploads" на "--exclude = uploads /"
В моей настройке ((источник - тип формата Ubuntu ext4 для целевого типа fuseblk Western Digital) он работает с:
rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded --exclude='*~' --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
Используйте правила в файлах фильтров вместо --exclude
. Это позволяет помечать исключаемые файлы как «скоропортящиеся», что позволяет удалять непустые каталоги, содержащие исключенные файлы.
Видеть этот ответ для подробностей.
Чтобы вы могли удалить каталог, он должен быть пустым, обычно этого требует файловая система.
Поэтому обычно rsync
или rm
сначала рекурсивно удалит все содержимое, а только потом удалит теперь пустой каталог.
Если текущий пользователь не является владельцем всех файлов, разрешения файловой системы не позволят вам удалить эти файлы. Поскольку они не будут удалены, каталог не будет очищен, и удаление не удастся.
Сначала я предполагаю, что некоторые файлы в этом каталоге принадлежат другому пользователю, например. пользователи apache или никто.