У меня есть имена файлов, как показано ниже
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
При необходимости узор можно сделать более прочным.