сохраните последний файл каждого месяца и удалите остальных

Вы можете использовать поддержку SVN GitHub:

svn export https://github.com/user/project/trunk

здесь подробнее:

https://stackoverflow.com/questions/9609835/git-export-from- Github-удаленный репозиторий

0
25.11.2018, 02:47
4 ответа

в системе GNU, с этим конкретным шаблоном имени файла

ls -r | uniq -w23

даст вам, чтобы сохранить. Таким образом, вы могли бы отодвинуть их:

ls -r | uniq -w23 | xargs mv -t ../to-keep/

и удалить все оставшиеся файлы.

23 - длина vtm_data_12month_201409 . Таким образом, Uniq вернет только первый файл (в обратном отсортированном списке файлов) среди списка файлов, которые имеют идентичный префикс длиной 23 символа.

Чтобы сделать это в одном Go:

ls -r | awk -F_ 'a[substr($NF,1,6)]++'

, который перечисляет файлы для удаления.

ls -r | awk -F_ 'a[substr($NF,1,6)]++' | xargs rm -f

(это предполагает имена файлов, которые не содержат, пустые, цитаты или символы обратной косания).

Здесь, а не 23 первых символов, мы смотрим на первые 6 символов после последнего _ символ.

2
28.01.2020, 02:20

Вам нужно решить это Проблема в целом или только один раз? Если вам просто нужно решить это один раз, иногда простое решение лучше. Мы можем использовать расширение скобки в Bash:

rm vtm_data_12month_2014{09,10}{01..29}.txt

Это может работать в вашем случае с:

  • Количество аргументов, которые мы отправим к RM , вряд ли отправят нас через arg_max, а
  • В тот день, когда вы хотите остановиться, одинаково в октябре, так и в сентябре.

Если вам нужно решить эту проблему в целом, вам нужно будет учитывать тот факт, что разные месяцы в разных днях (октябрь, например, заканчиваются 31-й, но ваш пример имеет только данные до 30) Отказ

Если схема именования файлов в вашем примере можно полагаться, то следующее будет удалять все, кроме новейшего файла, доступного для каждого месяца (на основе имени файла, а не фактических временных метров, связанных с созданием или модификацией файла):

get_years() {
  find ./ -type f | cut -d'_' -f4 | cut -c1-4 | sort | uniq
}

get_months_for_year() {
  year=$1
  find ./ -iname "vtm_data_12month_${year}*.txt" -type f | cut -d'_' -f4 | cut -c5-6 | sort | uniq
}

get_latest_for_year_month() {
  year=$1
  month=$2
  find ./ -iname "vtm_data_12month_${year}${month}*.txt" -type f | cut -d'_' -f4 | cut -c7-8 | sort | tail -1
}

for year in $(get_years); do
  for month in $(get_months_for_year $year); do
     latest=$(get_latest_for_year_month $year $month)
     end=$(($latest - 1))
     for i in $(seq 1 $end); do 
      day=$(printf '%02d' $i)
      rm vtm_data_12month_${year}${month}${day}.txt
     done
  done
done

Язык, отличный от Bash, который имеет библиотеку DATETIME, скорее всего, даст вам более симпатичное и надежное решение. Оба решения, представленные здесь, выделяют ошибки, если файлы на определенные дни отсутствуют.

0
28.01.2020, 02:20

Использование команда logrotate. Это - команда, которая обрабатывает ваши файлы журнала в /var/log. Это может повернуть регистрации на основе даты или размера.

Взгляд /etc/cron.daily/logrotate и /etc/logrotate.conf. Необходимо просто смочь поместить запись в /etc/logrotate.conf для обработки файла ваш хотеть вращаться.

Также посмотрите этот веб-сайт: http://www.rackspace.com/knowledge_center/article/understanding-logrotate-utility

Сообщенный мне, если вы должны еще помочь. Я буду стараться изо всех сил.

хорошо, таким образом, в моей системе /etc/cron.daily/logrotate называет logrotate один раз в день. /etc/logrotate.conf говорит logrotate, как обработать каждый файл. Таким образом, только необходимо волноваться об изменении /etc/logrotate.conf

, Вам придется просто добавить запись как это к вашему файл/etc/logrotate.conf .

/var/log/LOGFILENAME {
    monthly
    create 0664 root root
    rotate 1
}

Затем перезапускают вашу систему или крон, или однако вы вносите изменения, вступают в силу. Можно также протестировать файл конфигурации путем вызова logrotate непосредственно, таким образом:

/usr/sbin/logrotate /etc/logrotate.conf

строка вращается 1 , говорит logrotate сохранять одну старую копию, таким образом, вы закончите с ценностью двух месяцев регистраций: в предыдущем месяце и в этом месяце. Изменение вращается 1 к , вращаются 0 , если вы хотите сохранить только регистрацию текущего месяца.

2
28.01.2020, 02:20

Проверка достоверности даты и генерации диапазона даты сложно и подвержены ошибкам с помощью скрипта Bash. Лучшим выбором будет использоваться Python или или или любые другие языки сценариев более высокого уровня, которые могут выполнять проверки независимости. Я обновил скрипт, чтобы он мог удалить файлы в пределах даты и исключить диапазон даты.

Параметры будут похожи на

для удаления файлов в диапазоне

./dfile.py --from 20140929 --to 20141001  --range

, чтобы удалить файлы out out из диапазона

./dfile.py --from 20140929 --to 20141001  --out-range

Эта программа также генерирует полезную справочное сообщение - это аргументы даны неправильно.

#!/usr/bin/env python3


import os
import sys
import argparse
import datetime

parser = argparse.ArgumentParser()
parser.add_argument('--from', dest="fromd", type=str, required=True, help="From date")
parser.add_argument('--to', dest="tod", type=str, required=True, help="To date")
parser.add_argument('--range', dest='drange', action='store_true', help="Delete files between the given date")
parser.add_argument('--out-range', dest="orange", action='store_true', help="Delete files apart form the given date")

args = parser.parse_args()

if args.drange and args.orange:
    print('Enter either --range or --out-range option')
    sys.exit(1)
elif not (args.drange or args.orange):
    print('You must select either --range or --out-range option')
    sys.exit(1)

from_date = args.fromd
to_date = args.tod
path='/tmp/tmp.54JUy4ZP6x/'


try:
    from_date = datetime.datetime.strptime(from_date, '%Y%m%d').date()
    to_date   = datetime.datetime.strptime(to_date, '%Y%m%d').date()
except ValueError:
    print('Check if the date has been given in YYYYMMDD format')
    sys.exit(1)

files = [ x for x in os.listdir(path) if x.endswith('.txt') ]


for file in files:

    file_date = datetime.datetime.strptime(file[17:25], '%Y%m%d').date()

    if args.orange:
        # Delete files out of date range
        if not from_date < file_date < to_date:
            print('Deleting file {}'.format(file))
            os.remove(path + '/' + file)
    else:
        # Delete files within date range
        if from_date < file_date < to_date:
            print('Deleting file {}'.format(file))
            os.remove(path + '/' + file)

Здесь все параметры выполнены настраиваемыми, за исключением того, что путь должен быть изменен в программе.

Надеюсь, это поможет вам.

0
28.01.2020, 02:20

Теги

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