自动重命名文件

时间:2016-06-28 18:52:43

标签: bash terminal

我有一堆文件(超过1000个),如下所示

$ ls 
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-dev.lc
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-dev.lex
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-train.lc
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm-train.lex
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm.lc
org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm.lex
org.allenai.ari.solvers.termselector.ExpandedLearner.lc
org.allenai.ari.solvers.termselector.ExpandedLearner.lex
org.allenai.ari.solvers.termselector.ExpandedLearnerSVM.lc
org.allenai.ari.solvers.termselector.ExpandedLearnerSVM.lex
.... 

我必须通过在大写名称前添加learners来重命名这些文件文件。例如

org.allenai.ari.solvers.termselector.BaselineLearnersurfaceForm.lex

会改为

org.allenai.ari.solvers.termselector.learners.BaselineLearnersurfaceForm.lex

和这一个

org.allenai.ari.solvers.termselector.ExpandedLearner.lc

会改为

org.allenai.ari.solvers.termselector.learners.ExpandedLearner.lc

任何想法如何自动执行此操作?

3 个答案:

答案 0 :(得分:1)

有一个名为perl-rename, sometimes rename的工具。不要与rename from util-linux混淆。

对于像这样的任务非常有用,因为它需要一个perl表达式并相应地重命名:

perl-rename 's/(?=\.[A-Z])/.learners/' *

You can play with the regex online

替代方案,您可以使用for循环和$BASH_REMATCH

for file in *; do
  [ -e "$file" ] || continue
  [[ "$file" =~ ^([^A-Z]*)(.*)$ ]]
  mv -- "$file" "${BASH_REMATCH[1]}learners.${BASH_REMATCH[2]}"
done

答案 1 :(得分:0)

一种非常简单的方法(如果您只需要执行此操作,则非常有用)是ls >dummy将它们转换为文本文件dummy,然后在文本编辑器中使用find / replace来创建行形式为mv xxx.yyy xxx.learners.yyy。然后,您可以使用./dummy简单地执行生成的文件。

确切的查找/替换命令取决于您使用的文本编辑器,但类似

  1. org.替换为mv org.。这会让你在开始时mv
  2. mv org.allenai.ari.solvers.termselector.$1替换为mv org.allenai.ari.solvers.termselector.$1 org.allenai.ari.solvers.termselector.learner.$1以复制文件名并插入learner
  3. 还有for的语法,可以在一行中完成,(很长)但我无法解释 - 如果你想了解它,请尝试help for

答案 2 :(得分:0)

for f in org.*; do
    echo mv "$f" "$( sed 's/\.\([A-Z]\)/.learner.\1/' <<< "$f" )"
done

此短循环输出mv命令,该命令以您想要的方式重命名文件。首先按原样运行,当您确定它正在执行您想要的操作时,请删除echo并再次运行。

中间的sed位采用文件名($f,通过here-string,因此需要bash)并替换第一个出现的大写字母后面的点.learner.后跟相同的大写字母。