我的目录中有以下文件:
GE.AARS_vs_Control16.txt
GE.DHX30_vs_Control18.txt
GE.DNAJC2_vs_Control18.txt
我想删除*_Control<numeric>
并替换它*_Others
,以便文件将被重命名为
GE.AARS_vs_Others.txt
GE.DHX30_vs_Others.txt
GE.DNAJC2_vs_Others.txt
答案1
for file in /dir/*.txt; do
mv "$file" "${file%_*}_Others.txt"
done
这${file%_*}
是 shell 参数扩展的一种形式,它将删除最后一个_
及以后的所有内容。
答案2
使用 Perlrename
工具,假设您位于与要重命名的文件相同的目录中:
rename 's/_Control1[68]/_Others/' GE.*_Control1[68].txt
答案3
如果你喜欢一点混淆,这里还有另一种方法:
paste <(ls) <(ls | sed 's/_Control1[68]/Others') | sed 's/^/mv /' | bash
首先,尝试在不使用 bash 的情况下运行管道:-) 我假设目录中没有其他文件。如果有,请将每个替换ls
为ls *Controll1[68].txt
或某些类似的内容,以限制列表。
“我宁愿编写程序来编写程序,也不愿编写程序” - Richard Sites
(我可以发誓那是 Alan Perlis,但 Google 不同意)。