Year Month day do nome do arquivo no shell script

3

Eu tenho nomes de arquivos como abaixo

adn_DF9D_20140515_0001.log
adn_DF9D_20140515_0002.log
adn_DF9D_20140515_0003.log
adn_DF9D_20140515_0004.log
adn_DF9D_20140515_0005.log
adn_DF9D_20140515_0006.log
adn_DF9D_20140515_0007.log

eu quero pegar o ano, mês, dia do nome do arquivo e criar diretórios

Ex: [[ ! -d "$BASE_DIR/$year/$month/$day" ]] && mkdir -p "$BASE_DIR/$year/$month/$day";

Como conseguir isso e compartilhar as ideias / roteiro que você aprecia

    
por user3319390 10.06.2014 / 12:03

3 respostas

6

Se o nome do arquivo é sempre como no seu exemplo, você pode usar algo como:

for x in *.log; do year=${x:9:4}; month=${x:13:2}; day=${x:15:2}; [[ ! -d "$year/$month/$day" ]] && mkdir -p "$year/$month/$day"; done

Esta extração de substring está disponível no bash, não tenho certeza sobre outros shells.

    
por 10.06.2014 / 12:29
4

Use Perl, é excelente para analisar texto.

#!/usr/bin/perl

use strict;
use warnings;

my $filename = "adn_DF9D_20140515_0001.log";

my ( $year, $month, $day ) = ( $filename =~ m/adn_DF9D_(\d{4})(\d{2})(\d{2})/ );

print "$year $month $day\n";

Altere os formatos de arquivo diferentes a gosto. (Os 'colchetes' na expressão regular selecionam elementos padrão).

Se você está determinado a usar o shell:

DATE='echo $FILENAME | cut -d_ -f 3'
YEAR='echo $DATE | cut -c1-4'
MONTH='echo $DATE | cut -c5-6'
DAY='echo $DATE | cut -c7-8'
mkdir -p "$YEAR/$MONTH/$DAY"
    
por 10.06.2014 / 12:07
0

Aqui está um método usando o recurso de correspondência regex do Bash: '

pattern='([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})'

for file in *.log
do
    [[ $file =~ $pattern ]]
    read -r _ year month day <<< "${BASH_REMATCH[@]}"
    mkdir -p "$BASE_DIR/$year/$month/$day" # no need to test for existence when you use -p with mkdir
done

O padrão pode ser mais robusto se necessário.

    
por 11.06.2014 / 04:32