Копировать последние использованные файлы общего размера

Копировать последние использованные файлы общего размера

Я хочу скопировать последние использованные (или, может быть, созданные) файлы общего размера в другую папку. Возможно ли это без дополнительных инструментов?

У меня есть 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

Связанный контент