Назад | Перейти на главную страницу

Год Месяц день из имени файла в сценарии оболочки

У меня есть имена файлов, как показано ниже

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

я хочу получить год, месяц, день из имени файла и создать каталоги

Пример: [[ ! -d "$BASE_DIR/$year/$month/$day" ]] && mkdir -p "$BASE_DIR/$year/$month/$day";

Как этого добиться и поделиться идеями / сценарием, которые вам нравятся

Если имя файла всегда такое, как в вашем примере, вы можете использовать что-то вроде:

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

Это извлечение подстроки доступно в bash, не уверен в других оболочках.

Используйте Perl, он отлично подходит для анализа текста.

#!/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";

Внесите поправки для различных форматов файлов по вкусу. («Скобки» в регулярном выражении выбирают элементы шаблона).

Если вы полностью настроены на использование оболочки:

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"

Вот метод, использующий функцию сопоставления регулярных выражений 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

При необходимости узор можно сделать более прочным.