LINUX.ORG.RU

Bash script: найти файл в директории который больше подходит под текущую дату в имени файла

 


0

2

запутался, не могу понять как сделать с помощью bash скрипта

В папке файлы вида:
blabla_1_03_2016.txt
blabla_2_04_2016.txt
blabla_5_04_2016.txt
blabla_2_05_2016.txt
blabla_5_05_2016.txt
blabla_8_05_2016.txt
blabla_23_05_2016.txt

blabla_день_месяц_год.txt

надо найти самый подходящий файл
если текущая дата на компе 3_05_2016, то копировать файл blabla_2_05_2016.txt

если текущая дата на компе 7_05_2016, то копировать файл blabla_5_05_2016.txt

если текущая дата на компе 8_05_2016, то копировать файл blabla_8_05_2016.txt
и т.д.

Как определить подходящий в таких условиях...



Последнее исправление: Shamanches (всего исправлений: 7)

в лоб делал бы так:
реализовал datediff (разницу среди дат, например в днях: получить из имени файла дату, из нёё получить unix timestamp
команда date +%s --date=«2016-05-03» , получить unix timestamp на сегодня, вычислить разницу, разницу можно поделить на кол-во секунд в сутках)
вычислить её для всех. отсортировать по разнице по возрастанию, взять первый.

bl ★★★
()

если текущая дата на компе 3_05_2016, то копировать файл blabla_2_05_2016.txt

если текущая дата на компе 7_05_2016, то копировать файл blabla_5_05_2016.txt

не понятна логика. может в последнем условии ошибка и надо брать 6 число?

nerve ★★
()
Ответ на: комментарий от nerve

в том то и дело что именно так файлы идут... в принципе, почти у всех файлов в имени дни - это или понедельник или четверг. Может проще с этой стороны?

Shamanches
() автор топика
Ответ на: комментарий от Shamanches

если копировать файл с предыдущей датой

$ ls -la *bla*
-rw-rw-rw- 1 root root 4 2016-06-23 17:05 blabla_22_06_2016.txt
$ cat blabla_22_06_2016.txt 
QwE
$ d=`date --date="-1 day" +%_d_%m_%Y`
$ cp ./*${d}.txt ./new.blafile
$ cat new.blafile 
QwE
иначе нужно точнее сформулировать логику.

nerve ★★
()

Как определить подходящий в таких условиях...

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

alozovskoy ★★★★★
()
#!/bin/bash

today=$(date +"%Y%m%d")
lastdate="0"
file=""

for fext in *.txt; do
    f=${fext%.*}
    fdate=$(echo $f | awk -F'_' '{ printf "%02d%02d%02d", $4,$3,$2 }')

    if [ $fdate -ge $lastdate ] && [ $today -ge $fdate ]; then
        lastdate=$fdate
        file=$f
    fi
done

echo $file
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

сенкс, еще один вопросик появился %)

теже начальные условия, но в папке подпапок таких много (глубина 1уровень), т.е. надо выполнить этот скрипт поочередно для всех папок..

корневая папка-в ней подпапки (в один уровень)

Так обойти все папки?
find /НАЧАЛЬНЫЙ_КАТАЛОГ -maxdepth 1 -type d -exec ПОЛНЫЙ_ПУТЬ_К_ВАШЕМУ_СКРИПТУ {} \;

Shamanches
() автор топика
Ответ на: комментарий от Deleted

Хелп, все работало до тех пор пока в папке не появился файл с назаванием типа:bla_bla_1_03_2016.txt

остальные вида:
blabla_1_03_2016.txt
blabla_2_04_2016.txt
blabla_5_04_2016.txt

КАК ЗАСТАВИТЬ СЧИТАТЬ С КОНЦА ИМЕНИ ФАЙЛА?
echo $f | awk -F'_' '{ printf «%02d%02d%02d», $4,$3,$2 }'

Shamanches
() автор топика
Ответ на: комментарий от Shamanches

исправь

<     fdate=$(echo $f | awk -F'_' '{ printf "%02d%02d%02d", $4,$3,$2 }')
---
>     fdate=$(echo $f | awk -F'_' '{ printf "%02d%02d%02d", $(NF-2),$(NF-1),$NF }')

Deleted
()

если текущая дата на компе

ls -lrt blabla_*.txt | tail -1

futurama ★★★★★
()
Ответ на: комментарий от Deleted

я так понимаю так правильнее, приминимо к данному скрипту:

fdate=$(echo $f | awk -F'_' '{ printf «%02d%02d%02d», $NF,$(NF-1),$(NF-2) }')

Shamanches
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.