Я хочу скопировать последние использованные (или, может быть, созданные) файлы общего размера в другую папку. Возможно ли это без дополнительных инструментов?
У меня есть USB-накопитель определенного размера, который меньше общего размера папки. Поскольку я не могу скопировать все файлы на USB, я предпочитаю копировать на основе последнего использования, пока не закончится место. В идеале этот метод также поддерживает обновление файлов без необходимости стирать все файлы и копировать их заново.
решение1
Предполагая (на основе тега [linux]), что у вас есть bash
в наличии, а также команды stat
и sort
; и предполагая далее, что вы хотите сначала синхронизировать последние измененные файлы (см.человек статдля других вариантов временных меток), то вот скрипт bash, который будет проходить по всем файлам в текущем каталоге ( for f in *
это ключевая строка для этого), собирать их последние измененные временные метки в массив, затем он проходит по отсортированным временным меткам и выводит -- пример! -- команду 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
решение2
Вам следует отсортировать файлы по дате изменения, а затем передать имена в этом порядке rsync
для копирования. Вы также можете использовать cp
вместо этого, но rsync
это более эффективно.
На superuser.com уже есть тема о том, как это сделать:https://superuser.com/a/208749/554082