所以我有这个想法,根据源文件夹的名称将文件夹移动到不同的地方。
我想出了这个小脚本,它做了一些工作。它与一些名字不匹配,而且有时直接起作用也不起作用。
脚本:
#!/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
我想做的事情:
我不知道我是否一起走错了方向。
顺便提一下, 23是路径/path/to/folders/
中的字符数。
答案 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