Bash

根據名稱將文件移動到特定文件夾

  • June 26, 2019

我有這個文件/文件夾方案:

/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

有人可以幫我調整它,或者幫助我為這種情況提供更好的腳本嗎?

還有一種方法可以使腳本僅提取兩位數,而不管文件名方案如何,以防它與本範例中的不同

謝謝!

您可以通過參數擴展來提取數字。${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

引用自:https://unix.stackexchange.com/questions/527073