Переместить самые старые файлы в каталог, в исходный каталог постоянно поступает более 10 000 файлов

Из kernel README:

"make localmodconfig" Создает конфиг на основе текущего конфига и загруженных модулей (lsmod). Отключает любой модуль опции, которые не нужны для загруженных модулей.

Чтобы создать localmodconfig для другой машины, сохраните lsmod этой машины в файл и передайте его в качестве параметра LSMOD.

 target$ lsmod > /tmp/mylsmod
 target$ scp /tmp/mylsmod host:/tmp

 host$ make LSMOD=/tmp/mylsmod localmodconfig

Вышеуказанное также работает при кросс-компиляции.

 "make localyesconfig" Аналогично localmodconfig, за исключением того, что он преобразует
 все опции модуля во встроенные (=y) опции.

0
28.12.2018, 21:52
2 ответа

Хотя perl , вероятно, будет быстрее, чем перебор большого каталога "x" раз, вот простое решение методом грубой силы.

Внешний цикл определяет, сколько файлов будет перемещено --3 в этом примере. Внутри этого цикла мы инициализируем «самый старый» файл первым именем файла, полученным в результате подстановки *. Затем внутренний цикл сравнивает временную метку каждого файла, чтобы определить, старше ли он, чем(-ot)текущий -самый старый файл. Если это так, мы обновляем «самое старое» имя файла. В конце внутреннего цикла мы сообщаем и перемещаем этот файл.

for((count=0; count < 3; count++))
do
  set -- *
  oldest=$1
  for f in./*
  do
    if [ "$f" -ot "$oldest" ]
    then
      oldest=$f
    fi
  done
  echo mv -- "$oldest"./.archive
  mv -- "$oldest"./.archive
done
0
28.01.2020, 04:06

Питонheapq.nsmallest

баш:

find -printf '%T@ %p\n' |
python noldest.py 1000 |
xargs -Ixxx mv xxx directory_for_old_files

Здесь команда findвыводит список файлов в формате «секунды с 1970 (%T@ ), пробел, имя файла (%p )». Завершающая команда xargsберет имена файлов из стандартного ввода одно за другим и применяет команду mv xxx directory_for_old_files, заменяя ими xxx.

Реализация noldest.py может быть:

import sys
from heapq import nsmallest
from datetime import datetime


n = int(sys.argv[1])
date_file_pairs = (line.split(' ', maxsplit=1) for line in sys.stdin)  # generators are lazy

def parse_date(date_and_filename):
    seconds_from_1970 = float(date_and_filename[0])
    return datetime.fromtimestamp(int(seconds_from_1970))

for _, filename in nsmallest(n, date_file_pairs, key=parse_date):
    print(filename.rstrip('\n'))  # lines in sys.stdin have trailing newlines

Производительность зависит от реализации алгоритма nsmallestиз стандартной библиотеки Python.

0
28.01.2020, 04:06

Теги

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