Использование rsync для удаления только посторонних файлов

13

Каков наилучший способ сравнения двух структур каталогов и удаления посторонних файлов и каталогов в целевом местоположении?

У меня есть небольшое приложение для создания веб-галереи фотографий, которое я разрабатываю. Пользователи добавляют и удаляют изображения, используя FTP. Программное обеспечение для веб-галереи, которое я написал, создает новые эскизы на лету, но не занимается удалением. Что я хотел бы сделать, так это запланировать выполнение командного / bash-скрипта через определенные промежутки времени.

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

Я попытался использовать следующее для достижения этой цели:

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

это будет работать нормально, если все миниатюры уже были кэшированы, но нет никакой гарантии, что это произойдет, когда в этом случае в каталоге большого пальца будут скопированы оригинальные полноразмерные изображения.

Как мне лучше всего добиться того, что я пытаюсь сделать?

Bryan
источник

Ответы:

8

Я не думаю, что rsyncэто лучший подход для этого. Я бы использовал однострочник bash, как показано ниже:

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

Если этот однострочный файл создает правильный список файлов, вы можете изменить его для запуска rmкоманды вместо echoкоманды.

Том Шоу
источник
Спасибо, Том. Я думаю, чтобы также очистить каталоги, мне нужно было бы запустить его второй раз, но указав каталоги в командах вместо файлов, и подставив echo с rmdir?
Брайан
@ Брайан: Да, это звучит разумно. Вам нужно изменить флаги в 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).
Joril
источник
1
Если есть какие-либо ошибки, ваш удивительный ответ не сработает. Вот почему вам также необходимо добавить --ignore-errorsаргумент. Это единственное, что сработало для меня. Спасибо за --existingи --ignore-existing! Я использовал ваш ответ в качестве основы моего ответа здесь .
LonnieBest
1
@LonnieBest Если есть ошибки, даже нет rm, cpили они mvбудут работать так, как и есть: это проблемы, на которые следует обратить внимание и которые мешают успешному завершению операций. Вы можете указать большинству инструментов игнорировать ошибки (например, -fдля rm), но я не понимаю, насколько это актуально для вопроса или этого ответа.
Меки