2017-05-11 39 views
1

所以我有這種想法將文件夾移動到不同的地方,這取決於源文件夾的名稱是什麼。根據文件夾名稱移動文件夾

我想出了這個小小的腳本,它確實有點不錯。它與某些名稱不匹配,並且它有時只是直接起作用不起作用。

腳本:

#!/bin/bash 
for result in $(ls -d /path/to/folders/*/); 
do 
Size=${#result} 
StripFrom=$(expr index "$result" 'S\b[0-9]\b') 
Strip=4 
Stripped=$(($StripFrom-$Strip)) 
EndStrip=$(($Size-$Stripped)) 
EndStrip=-$EndStrip 
Serie=${result:23:$EndStrip} 
mv $result /path/to/TV/$Serie/ 
done 

我想要做的事:

  • 獲取 「/路徑/到/文件夾/」
  • 對於他們每個人的所有文件夾列表,搜索文本S0,S1,S2等
  • 獲取的電視節目是盈方的「S [0-0]」
  • 然後移動文件夾「/路徑/到/ TV /名稱-的秀」
部分名稱

我不知道我是否會以這種錯誤的方式在一起。

順便說一下,23是路徑/path/to/folders/中的字符數。

+1

你能給啓動目錄名稱的例子,會是怎樣產生的名稱/目錄? – 123

+0

開始名稱可能是Gotham.S01E14.720p。x264-lozer 結果字符串將是「Gotham」 –

+0

但是規範會在'Gotham.'包含期間產生結果。 –

回答

1

您可以用正則表達式提取系列名稱:

regex='/([^/]*).S[[:digit:]]{2}[^/]*/$' 

for dir in /path/to/folders/*/; do 
    if [[ $dir =~ $regex ]]; then 
     mv "$dir" /path/to/TV/"${BASH_REMATCH[1]}" 
    fi 
done 

表達查找S其次是路徑的最後兩個/之間兩位數字,捕獲的倒數第二個/S之間的一切,減去S之前的字符。

對於/path/to/folders/

folders 
├── show1.S01E14.blahblah 
├── show2.S11E01.text 
└── unrelateddir 

一個例子內容發出的命令是

mv /path/to/folders/show1.S01E14.blahblah/ /path/to/TV/show1 
mv /path/to/folders/show2.S11E01.text/ /path/to/TV/show2 

說明您的腳本:

  • 您不必循環超過ls的輸出如在$(ls -d /path/to/folders/*/)(請參閱here爲什麼這通常不是一個好主意),則可以直接使用glob。
  • 對此不完全確定,但S\b[0-9]\b將無法​​匹配,並且S後跟兩位數字,因爲數字之間沒有字邊界。
  • 在算術擴展中,您不需要$符號:Stripped=$(($StripFrom-$Strip))可以編寫Stripped=$((StripFrom - Strip))
+0

哦,這是一個更清潔,我應該學習更多/適當的正則表達式。非常感謝! –

0

可能使事情變得更加容易:

find /path/to/folders -name \*S[0-9]\* | while read $p 
do 
    result=$(basename "$p") 
    SEASON=$(expr "$result" : '[[:print:]]\+\(S[[:digit:]]*\)') 
    SHOW=$(expr "$result" : '\([[:print:]]\+\)S[[:digit:]]*') # with the trailing "." 
    echo "show: $SHOW/season: $SEASON" 
done 
相關問題