我有如下文件名
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
如果需要的话,可以使该模式更加稳健。