在Bash中提取文件名的某些部分

时间:2017-04-07 15:01:38

标签: bash text-processing

我在文件夹中有很多文件:

    <div class="col-md-2">
        <input class="form-control" asp-for="AppointmentDate">
        <span asp-validation-for="AppointmentDate" class="text-danger"></span>
    </div>

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

yyyymmdd_hhmmss.mp4
yyyymmdd_hhmmss_suffix1.mp4
yyyymmdd_hhmmss_suffix1_suffix2.mp4

其中$是数字0-9

我想抓住“yyyymmdd_hhmmss”并将其用作参数。 当我只提出一个后缀时,这就是我所做的:

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

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

for file in "$@"; do 
  file_nosuffix="${file%*_suffix1.mp4}.mp4"
  echo "$file and $file_nosuffix"
done

这可能吗?

1 个答案:

答案 0 :(得分: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%_*_*}

请参阅: