我尝试根据正则表达式将文件移动到子文件夹中。例如,我尝试将电视节目移动到正确的节目和季节文件夹中。所有文件都遵循“节目名称.S00E00.剧集标题.avi”的模式。
我查看过 mmv 和 rename,但似乎找不到任何有用的例子。
如果有人能给我指明正确的方向,我将非常感激。
编辑:我忘了提到文件夹结构是
./
Unsorted video files
Show Name/
Season 1/
Video Files Sorted
Season 2/
答案1
为了狂欢壳:
for file in *.avi; do
# use perl to transform the file name; could use 'sed -r' too
new_path=$(perl -pe 's|^(.+?)\.S0*(\d+)E0*(\d+)\.(.+)\.(\w+)$|$1/Season $2/Episode $3 - $4.$5|' <<< "$file")
# create directories if needed
mkdir -p "${new_path%/*}"
# move the file
mv -vn "$file" "$new_path"
done
在此正则表达式示例中 ( s|...|...|
):
$1
是节目名称(直到“.S<num>E<num>
”的所有内容);$2
和$3
是季/集编号;$4
是剧集标题(直到最后的“.
”为止的所有内容);$5
是文件扩展名。
如果您想保留季/集数中的前导零,请将S0*
and替换E0*
为S
and E
。如果您想处理其他文件类型,请*.avi
在第一行进行调整。
Debian 和 Ubuntu 附带一个基于 Perl 的prename
脚本(又名perl-rename
),可以用于此目的——它从 v1.8 开始自动创建目录,因此只需使用:
prename 'the above regexp' *.avi
答案2
或者您可以一直只使用 bash 命令(如果您的所有文件确实遵循您提供的结构):
for episode in *avi ; do
### cut $episode into fields, separated by "." and assign the first such field to $showname
### assign the second and third character of the second field to $season
showname=`echo $episode | cut -d "." -f1`
season=`echo $episode | cut -d "." -f2 | cut -c 2,3`
### create directory only if not already created
mkdir -p $showname/$season
### move the file
mv $episode $showname/$season/
done