Как лучше всего сравнить две структуры каталогов и удалить посторонние файлы и каталоги в целевом местоположении?
У меня есть небольшая веб-фотогалерея, которую я разрабатываю. Пользователи добавляют и удаляют изображения с помощью 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
команда.