rsync "не може видалити помилки непорожнього каталогу", навіть із опцією --force


28

Під час виконання цієї команди:

$ 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 2.0.3, якщо це актуально.

Оновлення: Додано sudoдо команди, щоб зрозуміти, що це не проблема доступу до файлів.


Яка файлова система є пунктом призначення? Чи потрібна файлова система для ремонту?
Маркус Даунінг

Файлова система є ext3. Можливо, файлова система може потребувати або ремонтувати. Я буду fsckпри наступній нагоді та оновлю з результатами.
tommarshall

Я просто fsckстворив систему, і це питання все ще присутнє.
tommarshall

Відповіді:


39

Ви намагалися додати --delete-excluded?

Якщо ви видалите каталог у виключених папках на "віддаленій" стороні, rsync --deleteвилучена папка на вашому "локальному" сайті не буде видалена .


Була папка, що називається uploadsв каталогах html/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samplesі html/js/ckeditor/plugins/uicolor/yuiкаталоги. Спасибі за вашу допомогу.
tommarshall

якщо --delete-excludedви використовуєте, але ви все ще хочете виключити певні файли / каталоги з видалення, ви можете помістити ці файли / каталоги --filter 'protect some_dir/', наприклад:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985

6

Ось можливі джерела цієї проблеми:

(1) Ця помилка може бути результатом параметра -b (--backup). Ця опція створить резервну копію кожного видаленого файлу, додавши до його імені файл tilde ( ~ ). (Це збентежило мене, оскільки ім'я файлу - це явно резервна копія, але ім'я каталогу - ні, оскільки тильда не видно.)

Щоб перевірити, чи це той самий випадок, прочитайте цільовий каталог на найглибшому рівні та перевірте, чи є який-небудь файл із закінченням tilde (~). Зауважте, що ці назви файлів, доданих у тильді, потім невидимі в звичайній системі перегляду файлів, тому ви можете їх не бачити.

Щоб вирішити цю справу, віддайте перевагу опції --backup-dir = DIR, наприклад --backup-dir = .rsync_bak.

(2) Параметр --exclude може мати однакові результати. Що, можливо, відбувається у вашому випадку. Система шаблонів потужна, але може вводити в оману. Наприклад, якщо ви пишете --exclude = '* ~', це пропустить усі файли, що закінчуються, в результаті точно так само, як у випадку (1) вище.

зі сторінки man rsync:

якщо шаблон починається з a /, то він прив’язаний до певного місця в ієрархії файлів, інакше він буде зіставлений проти кінця імені шляху

Якщо ви пишете --exclude = uploads, це виключить усі файли з назвою "оновлення" на будь-якому рівні дерева ваших файлів.

Перевірте, чи є у ваших каталогах, які не можна видалити, файл з назвою "uploads".

Рішенням було б змінити "--exclude = uploads" на "--exclude = uploads /"


0

У моїй установці (джерело типу 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

2
Яка частина цього насправді вирішує проблему?
Майкл Хемптон

0

Використовуйте правила у фільтруючих файлах замість --exclude. Вони дозволяють позначати виключення як "підлягаючі", що дозволить вам видаляти непорожні каталоги, які містять виключені файли.

Детальну інформацію див. У цій відповіді .


-1

Каталог повинен бути порожнім, щоб ви могли його видалити, файлова система зазвичай вимагає цього.

Тому зазвичай rsyncабо rmрекурсивно спочатку видаляється весь вміст і лише потім видаляється порожній каталог.

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

Першим моїм припущенням було б те, що деякі файли в цьому каталозі належать іншому користувачеві, наприклад, апахе або нікому користувачам.


Спасибі. Файли в каталогах дійсно належать користувачеві в групі apache, однак я просто намагався запустити цю команду як цей користувач, і я отримав ті самі помилки.
tommarshall

Крім того, якщо це проблема з дозволом на файл, я б розраховував виконати ту ж команду, що і для 'sudo', щоб вирішити проблему, але це не так. Однак, будь ласка, виправте мене, якщо я помиляюся.
tommarshall

1
Виконання команди як root має подолати більшість питань дозволу, так. (ймовірно, місце, де це все-таки не вдасться, знаходиться на монтажі nfs для назви одного, незмінного файлу іншого). Проста перевірка, ls -laщоб дізнатися, чому каталог все ще не порожній. lsattrбуде відображати незмінні файли.
HBruijn

Дякую за додаткову інформацію, проте lsattrз одного з перерахованих каталогів виводиться наступне: --------------- ./assets(немає прапорця i), і файл не знаходиться на монторі nfs. Чи є якісь інші причини, з яких ви могли б подумати, чому команда все-таки не зможе отримати sudo?
tommarshall

Чи є там якісь посилання або просто справжні файли?
Маркус Даунінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.