Исходя из предположения (на основе тега [linux]) что у вас есть bash
, а также команды stat
и sort
; в дальнейшем предположении, что вы хотите сначала синхронизировать самые последние измененные файлы (см. man stat для других параметров отметки времени), то вот сценарий bash, который будет циклически перебирать все файлы в текущем каталоге. ( для f в *
является ключевой строкой для этого), собирая их последние измененные временные метки в массив, затем он перебирает отсортированные временные метки и печатает - образец! - команда rsync для каждого файла (в настоящее время в качестве доказательства прилагается отладочная информация с отметкой времени).
Конечно, вам придется настроить команду rsync для вашей конкретной ситуации. Этот сценарий будет выводить команды rsync для каждого файла в текущем каталоге; Я предлагаю либо выполнить эти rsync «вслепую», допуская сбой тех, что в конце, либо поместить их в скрипт для отдельного выполнения.
Этот сценарий никоим образом не пытается оптимизировать использование пространства места назначения - единственное упорядочение, которое он выполняет, - это отметка времени последней модификации (и произвольный порядок ассоциативного массива в случае, если в папке изменено несколько файлов. тот же второй).
#!/usr/bin/env bash
declare -A times
# gather the files and their last-modified timestamp into an associative array,
# indexed by filename (unique)
for f in *
do
[ -f "$f" ] && times[$f]=$(stat -c %Y "$f")
done
# get the times in (unique) sorted order
for times in ${times[@]}
do
echo $times
done | sort -run | while read t
do
# then loop through the array looking for files with that modification time
for f in "${!times[@]}"
do
if [[ ${times[$f]} = $t ]]
then
echo rsync "$f" -- timestamp ${times[$f]}
fi
done
done