我有一堆文件(超过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
任何想法如何自动执行此操作?
答案 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
简单地执行生成的文件。
确切的查找/替换命令取决于您使用的文本编辑器,但类似
org.
替换为mv org.
。这会让你在开始时mv
。mv org.allenai.ari.solvers.termselector.$1
替换为mv org.allenai.ari.solvers.termselector.$1 org.allenai.ari.solvers.termselector.learner.$1
以复制文件名并插入learner
。还有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.
后跟相同的大写字母。