Bash
根據名稱將文件移動到特定文件夾
我有這個文件/文件夾方案:
/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