Linux中更改多个文件的名称

15
我有一些名为a1.txt,b1.txt,c1.txt等的文件在Ubuntu机器上。
是否有快速的方法更改所有文件名为a2.txt,b2.txt,c2.txt等?
特别是,我想替换名称字符串的一部分。例如,每个文件名都包含一个称为“apple”的字符串,我想在所有文件名中将“apple”替换为“pear”。
有没有任何命令或脚本可以实现?
6个回答

26

不需要任何额外的软件,您可以:

for FILE in *1.txt; do mv "$FILE" $(echo "$FILE" | sed 's/1/2/'); done

将sed 's/1/2/'替换为sed 's/1/2/g'以替换多个出现。 - Tsounabe

5
for f in {a..c}1.txt; do echo "$f" "${f/1/2}"; done

如果输出结果正确,将“echo”替换为“mv”。

并且我想将“apple”替换为“linux”。

for f in *apple*; do mv "$f" "${f/apple/linux}"; done

第一行中的花括号至少应该能在bash中正常工作。

@River:你遇到了什么问题?在哪个shell中?{a..c}在bash中是可以工作的。 - user unknown
1
首先,我认为将Linux替换为Pear是更明显的修复方法,因为“apple”->“pear”是OP中的示例,而Pear显然是意图,而Linux则是复制/粘贴残留物。其次,您的第二个命令需要在末尾添加done,否则它会提示您添加。第三,虽然花括号确实起作用,但我发现*通配符运算符更广泛适用(这是SO的重点),并且更直观。(这第三点更多是一个观点,而且您在第二个示例中使用了*,所以如果您保留第一个命令,我也可以接受。) - River
1
在实际操作之前,首先使用“echo”命令输出文件以确保正确的输出(Linux对小错误/笔误非常不友好),这个想法使得这个答案比我认为的被接受的答案更好一些,但是我觉得除非它1:执行与其声称的相同的操作(你原始答案中的linux/pear混淆)和2:当作为命令复制/粘贴时立即起作用(它需要“done”来完成),否则我无法支持它。 - River
1
@River: {a..c}1.txt比1.txt的解决方案要窄得多。如果读者理解了它,就可以轻松地将其采用到范围为m、n或z的情况中,而1.txt则是一种非常粗略的匹配。对于忽略了“完成”的问题,我感到抱歉。这是我的错,如果它没有在从“正确”到“正确”的任意更改中丢失,我会认出它的。从苹果到Linux而不是从苹果到梨的幽默变化,我想大多数读者都能立即理解。 - user unknown

2
以下命令将通过将文件名中第一次出现的1替换为2来重命名指定文件:
rename 1 2 *1.txt

在我的CentOS 5上完美运行。 - Robᵩ
1
啊!在Linux上有一个名为rename/usr/bin/prename: a /usr/bin/perl -w script text executable,它的工作方式不同。我想撤销我的反对票,但只要帖子没有被编辑,就无法进行操作。 - user unknown

0
ls *1.txt | perl -ne 'chomp; $x = $_; $x =~ s/1/2/; rename $_, $x;'

不要在脚本中解析ls的输出。首先,文件名中包含各种特殊字符,如空格、制表符、*和?,这会导致漏洞。 - user unknown
1
@user - 那是一般的好建议,这就是为什么我不会将上面的代码嵌入脚本中。 - Robᵩ

0

这是另一种选项,对于不同子目录中的文件(遵循上面的示例)对我有效。

for FILE in $(find . -name *1.txt); do mv "$FILE" "${FILE/1/2}"; done;

-1

类似这样的代码应该可以运行:

for i in *1.txt; do
    name=$(echo $i | cut -b1)
    mv $i ${name}2.txt
done

根据您的需求进行修改。


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