Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Unix-системы Новый топик    Ответить
 bash - удалять файлы по названию старше 2 недель  [new]
dake
Member

Откуда:
Сообщений: 140
есть файлы в формате
file_name_20190609.csv
file_name_20190610.csv
как мне хранить только файлы только за последние 2 недели учитываю дату из названия, а остальные удалять
поделитесь примером bash скрипта
заранее спс
10 июн 19, 10:29    [21905734]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
bga83
Member

Откуда: Город герой Ленинград
Сообщений: 30695
dake
поделитесь примером bash скрипта

man bash
man find
man sort
10 июн 19, 11:09    [21905763]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6793
dake,

man find

...
TESTS
Some tests, for example -newerXY and -samefile, allow comparison between the file cur‐
rently being examined and some reference file specified on the command line. When these
tests are used, the interpretation of the reference file is determined by the options -H,
-L and -P and any previous -follow, but the reference file is only examined once, at the
time the command line is parsed. If the reference file cannot be examined (for example,
the stat(2) system call fails for it), an error message is issued, and find exits with a
nonzero status.

Numeric arguments can be specified as

+n for greater than n,

-n for less than n,

n for exactly n.
...


## fix modification time of file by file name
## add -c or --no-create for non exists files
$ for i in {01..12}; do echo $i;touch -c -m -t 201906${i}0122 file_name_201905$i.csv;done
01
02
03
04
05
06
07
08
09
10
11
12

## show results
$ ls -l
итого 0
-rw-r--r-- 1 lejnin lejnin 0 июн  1 01:22 file_name_20190501.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  2 01:22 file_name_20190502.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  3 01:22 file_name_20190503.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  4 01:22 file_name_20190504.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  5 01:22 file_name_20190505.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  6 01:22 file_name_20190506.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  7 01:22 file_name_20190507.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  8 01:22 file_name_20190508.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  9 01:22 file_name_20190509.csv
-rw-r--r-- 1 lejnin lejnin 0 июн 10 01:22 file_name_20190510.csv
-rw-r--r-- 1 lejnin lejnin 0 июн 11 01:22 file_name_20190511.csv
-rw-r--r-- 1 lejnin lejnin 0 июн 12 01:22 file_name_20190512.csv

## find mtime greater then 6 days
$ find . -mtime +6 -print | sort 
./file_name_20190501.csv
./file_name_20190502.csv
./file_name_20190503.csv
./file_name_20190504.csv
./file_name_20190505.csv

## remove its
$ find . -mtime +6 -print -exec rm -f {} \;| sort 
./file_name_20190501.csv
./file_name_20190502.csv
./file_name_20190503.csv
./file_name_20190504.csv
./file_name_20190505.csv

## show
$ ls -l
итого 0
-rw-r--r-- 1 lejnin lejnin 0 июн  6 01:22 file_name_20190506.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  7 01:22 file_name_20190507.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  8 01:22 file_name_20190508.csv
-rw-r--r-- 1 lejnin lejnin 0 июн  9 01:22 file_name_20190509.csv
-rw-r--r-- 1 lejnin lejnin 0 июн 10 01:22 file_name_20190510.csv
-rw-r--r-- 1 lejnin lejnin 0 июн 11 01:22 file_name_20190511.csv
-rw-r--r-- 1 lejnin lejnin 0 июн 12 01:22 file_name_20190512.csv
12 июн 19, 22:03    [21907474]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18175
В вопросе есть одно уточнение, не позволяющее тупо юзать find
dake
как мне хранить только файлы только за последние 2 недели учитываю дату из названия

Как вариант -- сначала получить дату в строковом виде на 2 недели назад, а затем, благо формат располагает, /*сортировать и*/ удалять тех, кто меньше при строковом сравнении

Дату можно получить, например, GNU-шным date (date -d 'now-14days' +'%Y%m%d') или тем-же AWK. Хотя, конечно, можно потрахаться и с арифметикой дней/месяцев/годов
13 июн 19, 06:19    [21907575]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
fandr
Member

Откуда: ->Msk->SPb->Msk
Сообщений: 740
Вячеслав Любомудров
В вопросе есть одно уточнение, не позволяющее тупо юзать find
dake
как мне хранить только файлы только за последние 2 недели учитываю дату из названия

Как вариант -- сначала получить дату в строковом виде на 2 недели назад, а затем, благо формат располагает, /*сортировать и*/ удалять тех, кто меньше при строковом сравнении

Дату можно получить, например, GNU-шным date (date -d 'now-14days' +'%Y%m%d') или тем-же AWK. Хотя, конечно, можно потрахаться и с арифметикой дней/месяцев/годов


в этом собственно и вопрос,
функция вычисления даты "now -2weeks" - в общем случае не тривиальная

TS: не плохо бы указывать под какой системой весь этот колхоз
13 июн 19, 09:31    [21907686]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6793
Вячеслав Любомудров
В вопросе есть одно уточнение, не позволяющее тупо юзать find
dake
как мне хранить только файлы только за последние 2 недели учитываю дату из названия

Как вариант -- сначала получить дату в строковом виде на 2 недели назад, а затем, благо формат располагает, /*сортировать и*/ удалять тех, кто меньше при строковом сравнении

Дату можно получить, например, GNU-шным date (date -d 'now-14days' +'%Y%m%d') или тем-же AWK. Хотя, конечно, можно потрахаться и с арифметикой дней/месяцев/годов



Чтобы не считать, делаем циклы по годам/месяцам/дням

Генерим синтетическую дату и проверям наличие файла

Вот скрипт накатал
$ cat t.sh
#!/bin/bash
FILEMASK=file_name_
for yyyy in `date +%Y` $(((`date +%Y` - 1 )))
do for mm in {01..12}
  do for dd in {01..31}
   do 
MYDT=${yyyy}${mm}${dd}
MYFILE=${FILEMASK}${MYDT}.csv
test -w $MYFILE && touch  -m -t ${MYDT}0122 $MYFILE
   done
  done
done

find . -name ${FILEMASK}'20[0-9][0-9][01][0-9][0-9][0-9].csv' -mtime +13 -print


Если заменить for шаблоны типа
{01..31}
на простой список
01 02 03 ... 31
и башовскую кракозябру
$(((`date +%Y` - 1 )))


на
$(expr `date +%Y` - 1)


То будет практически POSIX
13 июн 19, 10:10    [21907707]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18175
fandr
Вячеслав Любомудров
В вопросе есть одно уточнение, не позволяющее тупо юзать find
пропущено...

Как вариант -- сначала получить дату в строковом виде на 2 недели назад, а затем, благо формат располагает, /*сортировать и*/ удалять тех, кто меньше при строковом сравнении

Дату можно получить, например, GNU-шным date (date -d 'now-14days' +'%Y%m%d') или тем-же AWK. Хотя, конечно, можно потрахаться и с арифметикой дней/месяцев/годов


в этом собственно и вопрос,
функция вычисления даты "now -2weeks" - в общем случае не тривиальная

TS: не плохо бы указывать под какой системой весь этот колхоз
Что тут нетривиального?
Я привел один способ прямой (через GNU date), второй -- чуть подумать (через AWK)

Ну или можно потрахаться, как продемонстрировано в предыдущем посте
13 июн 19, 10:30    [21907727]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18175
Хотя да, в той же солярке и awk резанный, но можно установить гнутый
Oracle Corporation      SunOS 5.11      11.3    February 2018
lubomudr@chaos:~$ awk 'BEGIN { print strftime("%Y%m%d", systime()-14*24*60*60) }'
awk: syntax error near line 1
awk: illegal statement near line 1
lubomudr@chaos:~$ gawk 'BEGIN { print strftime("%Y%m%d", systime()-14*24*60*60) }'
20190530
13 июн 19, 10:59    [21907746]     Ответить | Цитировать Сообщить модератору
 Re: bash - удалять файлы по названию старше 2 недель  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9288
Вячеслав Любомудров
В вопросе есть одно уточнение, не позволяющее тупо юзать find
dake
как мне хранить только файлы только за последние 2 недели учитываю дату из названия
+ Найдено в поиске "man find"
Expressions
Valid expressions are:
...
-name pattern

True if pattern matches the basename of the current file name.
Normal shell file name generation characters (see sh(1)) can be used.
A backslash (\) is used as an escape character within the pattern.
The pattern should be escaped or quoted when find is invoked from the shell.

Unless the character '.' is explicitly specified in the beginning of pattern,
a current file name beginning with '.' does not match pattern when using
/usr/bin/find. /usr/xpg4/bin/find does not make this distinction; wildcard
file name generation characters can match file names beginning with '.'
13 июн 19, 17:50    [21908145]     Ответить | Цитировать Сообщить модератору
Все форумы / Unix-системы Ответить