shell脚本中文件名中的年月日

shell脚本中文件名中的年月日

我有如下文件名

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";

如何实现这一点并与您分享想法/脚本欣赏

答案1

如果文件名始终像示例中的那样,则可以使用类似以下内容:

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 中可用,但不确定其他 shell 是否可用。

答案2

使用 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";

修改不同的文件格式以适应不同的口味。(正则表达式中的“括号”选择模式元素)。

如果你坚持使用 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"

答案3

以下是使用 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

如果需要的话,可以使该模式更加稳健。

相关内容