2017-05-11 121 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 
相关问题