移动文件夹取决于foldername

时间:2017-05-11 17:55:06

标签: linux bash

所以我有这个想法,根据源文件夹的名称将文件夹移动到不同的地方。

我想出了这个小脚本,它做了一些工作。它与一些名字不匹配,而且有时直接起作用也不起作用。

脚本:

#!/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

我想做的事情:

  • 获取" / path / to / folders /"中所有文件夹的列表;
  • 对于每一个,搜索文本S0,S1,S2 e.t.c.
  • 获取电视节目的名称,这是" S [0-0]"
  • 然后将文件夹移至" / path / to / TV / Show-of-show"

我不知道我是否一起走错了方向。

顺便提一下,

23是路径/path/to/folders/中的字符数。

2 个答案:

答案 0 :(得分: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 ))

答案 1 :(得分: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