Використання rsync для видалення лише сторонніх файлів


13

Який найкращий спосіб порівняти дві структури каталогів та видалити сторонні файли та каталоги в цільовому місці?

У мене є невелике додаток для веб-фотогалереї, яке я розробляю. Користувачі додають та видаляють зображення за допомогою FTP. Програмне забезпечення веб-галереї, яке я написав, створює нові ескізи на ходу, але це не стосується видалення. Що я хотів би зробити, це запланувати сценарій команд / bash, щоб піклуватися про це за попередньо визначені інтервали.

Оригінальні зображення зберігаються /home/gallery/images/в альбомах і впорядковуються за допомогою підкаталогів. Ескізи кешуються /home/gallery/thumbs/, використовуючи ту саму структуру каталогу та назви файлів, що і каталог зображень.

Я намагався використовувати це для досягнення цього:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

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

Як я можу найкраще досягти того, що намагаюся зробити?

Відповіді:


8

Я не думаю, що rsyncце найкращий підхід для цього. Я б використав bash one-liner на зразок наступного:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

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


Спасибі Томе. Я думаю, щоб також очистити каталоги, мені потрібно було б запустити його вдруге, але вказуючи каталоги в командах замість файлів і замінюючи ехо rmdir?
Брайан

@Bryan: Так, це звучить розумно. Вам потрібно буде змінити прапори в тесті findта в ньому . Звичайно, будьте дуже обережні як з командою, яку я вам дав, так і з будь-якими модифікаціями, і ретельно протестуйте ! []echo
Том Шоу

Величезне спасибі, під час тестування я застосую велику кількість ехо.
Брайан

1
Просто була думка: ви можете протестувати з "ls", щоб переконатися, що він добре працює з пробілом. Найкращі побажання.
Том Шоу

34

Вам також потрібно --existing:

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

На сторінці сторінки:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
Якщо якісь помилки взагалі є, ваша чудова відповідь не спрацює. Тому вам також потрібно додати --ignore-errorsаргумент. Це єдине, що працювало на мене. Дякую за --existingі --ignore-existing! Я використав вашу відповідь як основу своєї відповіді тут .
LonnieBest

1
@LonnieBest Якщо є помилки, навіть не rm, cpабо mvбуде працювати , як це те, що помилки є: Це проблеми , які повинні бути розглянуті і які заважають операції з завершення успішної. Ви можете доручити більшість інструментів ігнорувати помилки (наприклад, -fдля rm), але я не бачу, наскільки це стосується питання чи цієї відповіді.
Мецький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.