2017-04-07 31 views
1

我有一个文件夹中的许多文件:提取文件名的某些部分猛砸

yyyymmdd_hhmmss.mp4 
yyyymmdd_hhmmss_suffix1.mp4 
yyyymmdd_hhmmss_suffix1_suffix2.mp4 

以下文件名格式也是可能的(很少):

yyyymmdd_hhmmss_$$$.mp4 
yyyymmdd_hhmmss_$$$_suffix1.mp4 
yyyymmdd_hhmmss_$$$_suffix1_suffix2.mp4 
yyyymmdd_hhmmss_$$.mp4 
yyyymmdd_hhmmss_$$_suffix1.mp4 
yyyymmdd_hhmmss_$$_suffix1_suffix2.mp4 
yyyymmdd_hhmmss_$.mp4 
yyyymmdd_hhmmss_$_suffix1.mp4 
yyyymmdd_hhmmss_$_suffix1_suffix2.mp4 

其中$是一个数字0〜 9

我试图抓住“YYYYMMDD_HHMMSS”,并用它作为参数。 这是我做什么,当只有一个后缀提出:

for file in "[email protected]"; do 
    file_nosuffix="${file%*_suffix1.mp4}.mp4" 
    echo "$file and $file_nosuffix" 
done 

但是,当上面提到的文件名格式的种种都我迷路。 理想情况下,我想坚持目前的模式:

这可能吗?

+0

你为什么不只是保存前15个字符到一个变量? – Kathara

+1

另外,默认情况下,'for file'遍历'“$ @”'。 –

+0

此外,顺便提一下,提供的测试数据实际上与您所陈述的格式相符,而不是用于人类的描述性内容,但不能用于实际测试。 'yyyymmdd_hhmmss'与预期所有这些字符都是数字的东西不匹配,例如,*可能是*您的实际格式。 –

回答

4

bash有内置的正则表达式的支持,如果您想确认的格式为:

regex='^[[:digit:]]{8}_[[:digit:]]{6}' # POSIX ERE; can't use PCRE extensions here 

for file; do 
    if [[ $file =~ $regex ]]; then 
    echo "${BASH_REMATCH[0]} is the substring for $file" >&2 
    else 
    echo "$file does match the required format" >&2 
    fi 
done 

人们也可以采取平凡的前缀;

for file; do 
    prefix=${file:0:15} 
    echo "Prefix for $file is $prefix" 
done 

...或者,他们之后删除最后两个下划线和一切:

prefix=${file%_*_*} 

参见:

+0

谢谢大家的帮助。我想我会继续前进。但是,我想知道是否有一种方法可以编写任何适用于anyname_suffix1_suffix2.mp4的代码 – AndriusWild

+0

您真正想要什么逻辑?最后杀死'_ * _ *'? 'prefix = $ {file%_ * _ *}',那么。 –

+0

prefix = $ {file%_ * _ *}很棒,这正是我想要的!谢谢@Charles Duffy – AndriusWild