根据名称将文件移动到特定文件夹

根据名称将文件移动到特定文件夹

我有这个文件/文件夹方案:

/Aula
  /Aula01
  /Aula02
aula-01.1.mp4
aula-01.2.mp4
aula-01.3.mp4
aula-02.1.mp4
aula-02.2.mp4
aula-02.3.mp4

所有 mp4 文件都位于根目录 (Aula) 中,其中包含名为 Aula01、Aula02 等子文件夹...

我想根据文件名中间的两位数字和子文件夹名称的最后部分将这些文件移动到其特定的子文件夹。像这样:

/Aula
  /Aula**01**
    aula-**01**.1.mp4
    aula-**01**.2.mp4
    aula-**01**.3.mp4
  /Aula**02**
    aula-**02**.1.mp4
    aula-**02**.2.mp4
    aula-**02**.3.mp4

我四处搜寻并找到了这个脚本,但我的知识太有限,无法对其进行调整。

#!/bin/bash
for f in *.{mp4,mkv}           # no need to use ls.
do
    filename=${f##*/}          # Use the last part of a path.
    extension=${f##*.}         # Remove up to the last dot.
    filename=${filename%.*}    # Remove from the last dot.
    dir=${filename#tv}         # Remove "tv" in front of filename.
    dir=${dir%.*}              # Remove episode
    dir=${dir%.*}              # Remove season
    dir=${dir//.}              # Remove all dots.
    echo "$filename $dir"
    if [[ -d $dir ]]; then     # If the directory exists
        mv "$filename" "$dir"/ # Move file there.
    fi
done

有人可以帮助我调整它,或者帮助我为这种情况提供更好的脚本吗?

还有一种方法可以使脚本仅提取两位数字,而不管文件名方案如何,以防它与本示例中的不同

谢谢!

答案1

您可以通过参数扩展来提取数字。${f:5:2}从变量的第五个位置选择两个字符$f

#! /bin/bash
for f in aula-??.?.mp4 ; do
    num=${f:5:2}
    mv "$f" Aula"$num"/
done

如果位置不固定,要从文件名中提取两位数字,请使用

#! /bin/bash
for f in *.mp4 ; do
    if [[ $f =~ ([0-9][0-9]) ]] ; then
        num=${BASH_REMATCH[1]}
        mv "$f" Aula"$num"/
    else
        echo "Can't extract number form '$f'" >&2
    fi
done

相关内容