如何在Unix中使用mv命令重命名多个文件?

5

我正在尝试将扩展名为xyz[n]的多个文件重命名为扩展名xyz

示例:

mv *.xyz[1] to *.xyz

但是错误显示为 - " *.xyz 没有这个文件或目录"

这个命令试图将 *.xyz[1] 移动到目录 *.xyz(如果我们忽略中间的“to”,这是无效的 :)。这就是为什么它不起作用。你需要一点脚本来完成这个任务。 - Damien Overeem
文件名扩展名包含 []。您确定吗? - theharshest
感谢大家的回复。 - Learner
@Damien 但是简单的 mv abc.xyz[1] abc.xyz 是可以工作的。 - Learner
可能是在Unix中重命名多个文件的重复问题。 - ajmartin
显示剩余2条评论
4个回答

5
我不知道mv命令是否可以直接使用星号进行操作,但是以下方法可以解决问题。
find ./ -name "*.xyz\[*\]" | while read line
do 
mv "$line" ${line%.*}.xyz
done

2

假设我们有以下文件。现在我想从这些文件中删除-(ab...)部分。

> ls -1 foo*
foo-bar-(ab-4529111094).txt
foo-bar-foo-bar-(ab-189534).txt
foo-bar-foo-bar-bar-(ab-24937932201).txt

因此,预期的文件名应该是:
> ls -1 foo*
foo-bar-foo-bar-bar.txt
foo-bar-foo-bar.txt
foo-bar.txt
> 

以下是一个简单的方法来实现它。
> ls -1 | nawk '/foo-bar-/{old=$0;gsub(/-\(.*\)/,"",$0);system("mv \""old"\" "$0)}'

如需详细解释,请查看此处


感谢Sarathi的回复 当我在终端上输入命令时,我收到了nawk命令未找到的错误。 精确输出为“-bash:nawk:command not found”然后我尝试使用awk命令 ls -1 |awk '/110X/{old=$0;gsub(/[/,"",$0);system("mv ""old"" "$0)}'但是我收到了错误 " awk:非终止字符类[ 源行号1 上下文是
/110X/{old=$0;gsub(/[/,"",$0) "
- Learner
我的文件名类似于20130110X1YZ.rtf[2] 20130110XYZ.rtf[1] 20130110XYZ1.rtf[2],我想从名称中删除[n]值,例如将20130110X1YZ.rtf重命名为20130110X1YZ.rtf[2]。 - Learner
你可以尝试使用awk代替nawk。我在Solaris上使用nawk,所以它在Solaris上运行良好。 - Vijay

0

这里有另一种使用StringSolver自动化工具的方法。假设您的第一个文件名为abc.xyz[1],第二个文件名为def.xyz[1],第三个文件名为ghi.jpg(与前两个不同的扩展名)。

首先,通过给出示例来筛选您想要的文件(ok和notok是任何单词,使得第一个描述接受的文件):

filter abc.xyz[1] ok def.xyz[1] ok ghi.jpg notok

然后使用它创建的过滤器执行移动操作:

mv abc.xyz[1] abc.xyz
mv --filter --all

第二行将第一个转换推广到所有以.xyz[1]结尾的文件。

最后两行也可以缩写成一个,它执行移动并立即进行概括:

mv --filter --all abc.xyz[1] abc.xyz

免责声明:本文是我与他人共同撰写的学术作品。其他示例可在youtube上找到。


0

我认为mv不能直接操作多个文件,需要循环。 相反,请使用rename命令。它使用正则表达式,但一旦掌握就很容易使用且更强大。

rename 's/^text-to-replace/new-text-you-want/' text-to-replace*

例如,将目录中所有的.jar文件重命名为.jar_bak。
rename 's/^jar/jar_bak/' jar*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接