Одной из идей было бы использовать комбинацию fdupes
и rsync
.
rsync
. rsync
. Для этого нам понадобятся три локации:
$origdir
. $stagingdir
. $destdir
. Во-первых, создайте промежуточную область (это предполагает, что промежуточная область еще не существует, или если она существует, то она содержит только вещи, которые должны быть перемещены):
rsync --archive --verbose --link-dest="$origdir" \
--include="*.jpg" --include="*/" --exclude="*" \
"$origdir/" "$stagingdir"
При этом все файлы, имена которых заканчиваются на .jpg
, будут скопированы в промежуточную область путем создания жестких ссылок из их исходных местоположений. Потребуется только пространство для создания структуры каталогов, и данные файла не будут дублироваться (, если только $stagingdir
и $origdir
не будут расположены на двух разных разделах ). Чтобы добавить другие шаблоны имен файлов, добавьте дополнительные параметры --include
(перед параметром--exclude
).
Затем выполните fdupes
над$stagingdir
:
fdupes --delete --recurse "$stagingdir"
Это интерактивно запросит у вас подтверждение перед удалением чего-либо. Также есть опция --noprompt
, которая удаляет файлы без подтверждения. Пожалуйста, внимательно прочтите fdupes
руководство . Файлы в папке $origdir
не будут затронуты удалением файлов из промежуточной области,
Затем удалите пустые каталоги из промежуточного каталога (это дополнительный шаг, который просто немного наводит порядок):
find "$stagingdir" -type d -empty -delete -print
Это пройдёт всю промежуточную область и удалит все пустые каталоги. Любой удаленный каталог будет напечатан после успешного удаления.
И, наконец, перенесите не -дубликаты:
rsync --archive --verbose "$stagingdir/" "$destdir"
Этот процесс сохранит исходную структуру каталогов для файлов, которая соответствует шаблонам, используемым в первом rsync
, и которые все еще остаются на месте после того, как fdupes
удалил дубликаты.
Допустимый диапазон часов: 0-23
, поэтому следует использовать
*/15 7-18 * * *
для запуска каждые 15 минут от07:00
(первого запуска )до18:45
(последнего запуска )каждый день.
Начальный нуль для диапазона часов(07
)был причиной того, что поле часов принималось как *
. Я проверил(cronie-1.5.1-lp151.4.6.1.x86_64
на suse ), что поведение совпадает с вашим описанием для диапазона, например * 01-02 * * *
, но неожиданно сработало правильно для одного значения:* 01 * * *
. Так что я бы не стал копать дальше, мы просто не используем начальные нули.