【问题标题】:How to rename all the files using shell script?如何使用 shell 脚本重命名所有文件?
【发布时间】:2011-12-20 02:11:02
【问题描述】:

我有数百个相同格式的文件。我想通过使用前六个字符和扩展名来重命名文件。

以下代码提取前 6 个字符...我正在显示它们

     for i in *.png; do echo $i | awk '{ print substr($0, 0, 7 )}'; done

我无法连接扩展程序。有人可以帮忙吗。如果脚本能用 mv 命令完成就好了。

谢谢

【问题讨论】:

  • 所以你所有的文件至少有 6 个字符 + ext 比如:123456.png?
  • 是的,它们在 6 个字符内都是唯一的,否则重复无关紧要。这个问题清楚地暗示了这一点。知道提问者对实际情况有多自信会很有趣。

标签: shell


【解决方案1】:

假设每个文件名在扩展名前至少有六个字符,你可以写

for file in *.png ; do mv "$file" "${file:0:6}.png" ; done

【讨论】:

  • 这真的很酷。想知道是否有任何书包含所有这些很酷的技巧。 +1
  • @JaypalSingh:都在the Bash Reference Manual 中。它的 。 . .不完全是“轻松阅读”,但如果您在 Bash 中工作很多,那么值得付出努力。
【解决方案2】:

在循环体外面做管道,如果继续使用awk:

for i in *.png; do echo $i; done |
awk '{ print "mv $0 " substr($0, 0, 7) ".png"}' |
sh -vn

修改后的awk 打印mv 命令。当您感到高兴时,它会做正确的工作,将 -vn 替换为 -x(或什么都不做)。

这几乎适用于任何 shell。如果您专门使用bash,那么有内置的字符串操作可以完成您需要的工作 - 请参阅ruakh 的答案以了解一种可能的技术。还有无数其他选择;一些系统有一个功能强大的rename 命令(其他系统有一个功能较弱的版本)。

【讨论】:

  • 原谅我的无知,但是for i in *.png; do echo $i; done不是更简洁地写成echo *.png吗?
  • 循环和单个echo 之间的区别在于循环将每个“单词”放在自己的行中,而单个echo 将所有单词放在一行中。您也可以编写一个awk 脚本来处理这个问题,但是您需要对输入记录中的字段数进行显式循环。我有一个简单的 C 程序,它每行回显一个参数,并且发现它非常有用。多么琐碎?这个微不足道的:int main(int argc, char **argv) { while (*++argv != 0) puts(*argv); return 0; } 当然也需要#include <stdio.h>
  • 谢谢,我没有想到一行与多行。好的,那么,让我们使用更正宗的printf '%s\n' *.png :-)
  • 你可以;我很高兴不这样做,但那是因为我很久以前(很久很久以前)学习过 shell,而且我上面写的内容(在 shell 级别)可以在真正的旧系统和现代系统中工作(在 shell 级别)。 (原始的 awk 没有substr() 命令。)基本上,让像我这样的化石轻轻地变成化石,并适应自己的目的。
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2018-06-09
  • 2015-07-13
  • 2016-03-14
  • 1970-01-01
  • 2013-09-11
  • 2012-09-09
  • 2011-04-02
相关资源
最近更新 更多