이름을 기준으로 특정 폴더로 파일 이동

이름을 기준으로 특정 폴더로 파일 이동

다음과 같은 파일/폴더 구성표가 있습니다.

/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)에 있습니다.

파일 이름의 중간 두 자리와 하위 폴더 이름의 마지막 부분을 기준으로 이 파일을 특정 하위 폴더로 이동하고 싶습니다. 이와 같이:

/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

관련 정보