在Linux中重命名一组文件

3
我有100个名为sub1.txt, sub2.txt,..., sub100.txt的文件。我想将它们重命名为all1.txt, all2.txt,..., all100.txt。在Linux(Unix)中如何实现呢?
谢谢你的帮助。

有没有办法将这个迁移到Linux/Unix SE,而不是Super User - David Thomas
6个回答

7
下面的脚本将重命名任意数量的文件,使用模式sub*.txt。由于使用了echo,因此也可以进行干运行。一旦您对结果满意,只需删除echo即可。
#!/bin/bash

for file in sub*.txt; do
  echo mv "$file" "all${file#sub}"
done

删除echo,或者|sh ;-) - mvds
3
在 SO 上放置具有破坏性的脚本时,我始终包含echo,以使脚本在用户满意其结果之前变得无害。 - SiegeX
好的政策。会记住的。 - mvds

2
使用 util-linux-ng 版本的 rename:
rename sub all sub*.txt

使用Perl脚本版本的rename:
rename 's/^sub/all/' sub*.txt

1
几乎每个文件重命名问题在这个网站上都有一个简单的答案:使用rename - Martin

1
for i in `seq 1 100`; do mv sub$i.txt all$i.txt; done

或者

for i in sub*.txt; do j=`echo $i|sed -e s/sub/all/`; mv $i $j; done

由于OP标记了bash,我会使用shell的原生大括号扩展for i in {1..100},而不是调用外部二进制文件seq。另外,这可能只是我的一种追求完美的表现,但是在命令替换中使用$()代替反引号,因为后者不符合POSIX标准,并且不容易嵌套使用。 - SiegeX
没错,但是作为一种常规方法,使用类似这样的外部程序会(希望能)教会提问者如何在下次遇到问题时自己解决,而不再回到这里来。 - mvds

0

Ruby(1.9+)

ruby -e 'Dir["sub*.txt"].each {|x| File.rename(x, x.gsub(/^sub/,"all") ) }'

0
for F in sub*.txt ; do mv $F all${F#sub}; done

不要忘记引用你的变量名 - SiegeX
@siegeX 一般来说是个好主意,但在这种情况下其实不需要。 - Keith
@kurumi 这里为什么很重要呢? - Keith

-1

总有一种新的方法来做到这一点:

$ ls sub*.txt | tr -d "sub" | xargs -I{} mv sub{} all{}

希望能对你有所帮助。

解析 ls 应尽量避免。请参阅 http://mywiki.wooledge.org/ParsingLs - SiegeX
@SiegeX:哦!我明白了。不知道那个。find呢? - Pablo Santa Cruz
tr 不进行替换。字母 s、u 或 b 将被“删除”,而不是单词 “sub”。 - kurumi
@Pablo:解析find是一个很好的替代方法,我经常与其-print0标志一起使用,并与以NUL为分隔符的read内置命令结合使用。此外,符合POSIX-2004标准的find版本可以在其-exec命令之后加上+来使其的行为与将参数传递给xargs完全相同。 - SiegeX
@Pablo Santa Cruz,就像我说的那样,这不会起作用,因为tr只会删除字符,而不是整个单词。你不希望它在文件名的其他部分删除s、u或b。 - kurumi
@kurumi:看一下楼主的问题。他的文件名都是像sub1.txtsub2txt这样的。 - Pablo Santa Cruz

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