名前に基づいて特定のフォルダにファイルを移動する

名前に基づいて特定のフォルダにファイルを移動する

次のファイル/フォルダスキームがあります。

/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ファイルは、Aula01、Aula02などのサブフォルダを含むルートディレクトリ(Aula)にあります。

ファイル名の中間2桁とサブフォルダ名の最後の部分に基づいて、このファイルを特定のサブフォルダに移動したいと思います。このように:

/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

誰もがこの問題を調整するのに役立ちますか、この状況でより良いスクリプトを書くのに役立ちますか?

この例と異なる場合に備えて、ファイル名スキームに関係なく、スクリプトから2桁だけを抽出する方法もあります。

ありがとうございます!

答え1

パラメータ拡張により数値を抽出できます。${f:5:2}変数の5番目の位置から2文字を選択してください$f

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

場所が固定されていない場合、ファイル名から2桁を抽出するには、次のようにします。

#! /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

関連情報