Назад | Перейти на главную страницу

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

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

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

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

Я пробовал использовать для этого следующее:

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

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

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

Тебе нужно --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).

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

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

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