Script para excluir o arquivo com base em seu nome

1

Preciso de alguma opinião sobre meus scripts. Eu tenho alguns arquivos como o formato abaixo: -

-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_03.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_04.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_05.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_06.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_07.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_08.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_09.csv
-rw-r--r-- 1 root root 0 Apr 12 15:56 hostdata_mm-xxx1_2018_04_10.csv

Eu preciso ter apenas 1 arquivo, que é o dado de ontem, então, meu script é assim: -

#!/bin/bash

set -x
wd=/root/test
yest=$(date -d "yesterday" '+%Y_%m_%d')

cd $wd
for f in *[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9].csv; do
date=${f#*}
date=${date%.csv}
date='echo $date | rev'
date=${date:0:10}
date='echo $date | rev'
(( $date < $yest )) && rm $f
done

No entanto, recebi este erro

/usr/local/bin/testdelfile: line 15: ((: 2018_04_03: value too great for base (error token is "2018_04_03")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_04: value too great for base (error token is "2018_04_04")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_05: value too great for base (error token is "2018_04_05")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_06: value too great for base (error token is "2018_04_06")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_07: value too great for base (error token is "2018_04_07")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_08: value too great for base (error token is "2018_04_08")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_09: value too great for base (error token is "2018_04_09")
/usr/local/bin/testdelfile: line 15: ((: 2018_04_10: value too great for base (error token is "2018_04_10")

Aqui está o modo de depuração

+ for f in '*[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9].csv'
+ date=hostdata_mm-xxx1_2018_04_10.csv
+ date=hostdata_mm-xxx1_2018_04_10
++ echo hostdata_mm-xxx1_2018_04_10
++ rev
+ date=01_40_8102_1kmc-ym_atadtsoh
+ date=01_40_8102
++ echo 01_40_8102
++ rev
+ date=2018_04_10
+ ((  2018_04_10 < 2018_04_12  ))
/usr/local/bin/testdelfile: line 15: ((: 2018_04_10: value too great for base (error token is "2018_04_10")

por favor, conselhos

    
por user240614 13.04.2018 / 06:49

2 respostas

1

O operador

(( ... )) no bash espera um valor aritmético. O 2018_04_10 é uma string e você recebe um erro. Use [[ ... ]] para fazer uma comparação de string.

No entanto, com a data, aconselho a conversão para timestamp numérico date +%s para compará-lo com (( ... )) .

Você pode alterar seu script para:

yest=$(date -d "yesterday" '+%s')
for f in *[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9].csv; do
   date=$(sed -r 's/.*([0-9]{4})_([0-9]{2})_([0-9]{2}).csv/--/' <<< $f | xargs date +%s -d)
   (( $date < $yest )) && rm $f
done
    
por 13.04.2018 / 08:23
1

O problema com o script é que um operador inadequado é usado para a comparação de strings. Apenas substitua (( ... )) por [[ ... ]] na 14ª linha e o script funcionará bem.

Mais informações podem ser encontradas no link

Eu gostaria de sugerir uma solução mais simples. Com o find você pode excluir o nome do arquivo que deseja manter e, em seguida, excluir os outros arquivos no diretório:

find . -not -name "hostdata_mm-xxx1_$(date -d 'yesterday' '+%Y_%m_%d').csv" -type f -exec rm {} ";"
    
por 13.04.2018 / 08:55

Tags