【问题标题】:Batch renaming files in unix and rollback在 unix 和回滚中批量重命名文件
【发布时间】:2011-04-30 20:09:02
【问题描述】:

我重命名了几个文件(1234.xml9876.xml2345.xml 等),扩展名为.xml,代码如下:

 for i in *.xml  
 do  
 mv $i $i.ab  
 done

变成1234.xml.ab9876.xml.ab2345.xml.ab...等

现在,我想将其重命名为 1234.xml.SD9876.xml.SD2345.xml.SD...等。

这是 100 个文件。

如何在代码的帮助下实现这一点?请指教。

【问题讨论】:

标签: linux unix shell rename


【解决方案1】:

如果你使用 bash,你可以这样做:

for f in *.xml.ab; do
    mv "$f" "${f%.ab}.SD"
done

或者只使用rename 命令:

rename 's/ab$/SD/' *.xml.ab

【讨论】:

  • 但是如果你的文件名有空格,没有" 就会失败。因此,请始终将文件名包含在 " 中。
  • 请注意,此rename 命令来自 Perl 发行版,不是标准的 unix 命令。 Debian(以及 Ubuntu 等衍生发行版)将其作为 perl 软件包的一部分提供,但不太可能在其他地方提供。
  • 另外,这必须是 mv -- "$f" "${f%.ab}.SD",除非您知道文件名不以 - 开头。
  • @codaddict,啊,宝贵的提示 :-)
  • @Gilles,你的意思是如果文件名以 -1234.xml.ab 开头,那么我们应该使用 mv -- "$f" "${f%.ab}.SD" 附加它用“SD”?你是这个意思吗?
【解决方案2】:

你可以这样做:

for f in *.xml.ab; do
    mv $f `echo $f | sed 's/\.ab$//g'`
done

【讨论】:

  • 变量和命令替换需要双引号,并且echo 仅在文件名不以- 开头并且不包含反斜杠时才可靠。 mv --- "$f" "$(printf %s "$f" | sed 's/\.ab$//g')" 可以,但 codaddict's answer 在概念上更简单,也更容易正确。
【解决方案3】:

我不清楚你是要重命名 foo.xml.ab -> foo.xml 还是 foo.xml.ab -> foo.xml.SD

foo.xml.ab -> foo.xml

for f in *.xml.ab; do
    mv "$f" "${f%.ab}"
done

foo.xml.ab -> foo.xml.SD

for f in *.xml.ab; do
    mv "$f" "${f/.ab/.SD}"
done

【讨论】:

  • 这是您编写的第二个代码 [foo.xml.ab -> foo.xml.SD] 我正在尝试 :-) 谢谢
猜你喜欢
  • 2014-09-24
  • 2012-08-30
  • 2012-06-13
  • 1970-01-01
  • 2013-12-19
  • 2013-12-16
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多