Linux 正则表达式文件移动

Linux 正则表达式文件移动

我尝试根据正则表达式将文件移动到子文件夹中。例如,我尝试将电视节目移动到正确的节目和季节文件夹中。所有文件都遵循“节目名称.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*Sand 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

相关内容