用于重命名文件的Bash脚本

时间:2016-09-13 07:28:50

标签: bash

我有几个包含几个视频讲座的文件夹。 文件(视频)的名称类似topic blah blah blah - Lecture xx.mp4我希望将其重命名为Lecture xx.mp4

我写了以下bash脚本。它似乎挂起(变慢),也不提供输出。

for file in *.mp4; do 
    echo "Renaming file :: $file"
    nn=$(grep -o 'Lecture.[0-9]*' "$file")
    echo $nn
    #mv "$file" "$nn"
done

请帮我纠正这个剧本。

2 个答案:

答案 0 :(得分:2)

当您确实想要更改grep pattern [FILE...]参数值时,您的脚本会搜索文件的内容($file)。这应该可以解释为什么你的命令很慢并且似乎无法正常工作。

要更改$file参数的值,您可以使用名为参数扩展的Bash功能(请参阅man bash)。在您的情况下,可以使用{em>删除匹配前缀模式的${parameter##word}${file##* - }将删除* -的最长匹配。请注意,* -不是正则表达式,而是模式。模式匹配与正则表达式不同(比较*.*)。

#!/usr/bin/bash

for file in *.mp4; do
  new=${file##* - }
  echo "Renaming '$file' to '$new'"
  #mv "$file" "$new"
done

答案 1 :(得分:1)

使用rename程序可能会让生活更轻松 - 它是一个Perl脚本。在你的情况下,你会这样做:

rename --dry-run 's/.*(Lecture \d+)/$1/' *mp4

<强>输出

'topic blah blah blah Lecture 01.mp4' would be renamed to 'Lecture 01.mp4'
'topic blah blah blah Lecture 02.mp4' would be renamed to 'Lecture 02.mp4'
'topic blah blah blah Lecture 555556.mp4' would be renamed to 'Lecture 555556.mp4'

如果您喜欢它,请删除--dry-run。它具有优于大多数ad-hoc shell脚本的优势,它不会破坏文件,你可以进行干运行,并且它支持完整的Perl语法,因此你可以轻松地完成非常复杂的事情。