Вы можете использовать поддержку SVN GitHub:
svn export https://github.com/user/project/trunk
здесь подробнее:
https://stackoverflow.com/questions/9609835/git-export-from- Github-удаленный репозиторий
в системе 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 символов после последнего _
символ.
Вам нужно решить это Проблема в целом или только один раз? Если вам просто нужно решить это один раз, иногда простое решение лучше. Мы можем использовать расширение скобки в 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, скорее всего, даст вам более симпатичное и надежное решение. Оба решения, представленные здесь, выделяют ошибки, если файлы на определенные дни отсутствуют.
Использование команда 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
, если вы хотите сохранить только регистрацию текущего месяца.
Проверка достоверности даты и генерации диапазона даты сложно и подвержены ошибкам с помощью скрипта 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)
Здесь все параметры выполнены настраиваемыми, за исключением того, что путь
должен быть изменен в программе.
Надеюсь, это поможет вам.