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

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

У меня есть USB-накопитель определенного размера, который меньше, чем общий размер папки. Поскольку я не могу скопировать все файлы на USB, я хочу копировать их на основе последнего использования, пока не останется свободного места. В идеале метод также поддерживает обновление файлов без необходимости стирать все файлы и копировать их заново.

0
15.02.2016, 22:33
2 ответа

Исходя из предположения (на основе тега [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
1
28.01.2020, 02:35

Вам следует отсортировать файлы по дате изменения, а затем передать имена в этом порядке в rsync для копирования. Вы также можете использовать вместо него cp , но rsync более эффективен.

На superuser.com уже есть ветка о том, как это сделать: https://superuser.com/a/208749/554082

1
28.01.2020, 02:35

Теги

Похожие вопросы