从文件名中删除前缀


10

我有一堆文件,如下所示:

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

我需要重命名它们以排除前缀。它需要看起来像这样。

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

编辑

我忘了补充一点,我正在使用Solaris。

Answers:


19
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

运行此程序以确保一切正常。
如果是这样,请echo从命令中删除,它将根据需要重命名文件。

"${file#*_}"

是Shell中常用的替换功能。它删除第一个_符号之前的所有字符(包括符号本身)。有关更多详细信息,请单击此处


你能解释一下到底发生了"${file#*_}"什么吗?
Pieter van Niekerk,2012年

我在回答中添加了解释。

IMO,大多数脚本都应编写为回显所需的命令输出。但不要删除echo,只需将脚本输出通过管道传递到即可bash
吉姆·L

7

您可以rename为此使用工具:

rename "s/.*_//" *

如果追加-n,它将不会重命名任何内容,只会向您显示不使用会做什么-n

回应rush的评论:我rename实际上是prenameDebian和Ubuntu perl软件包附带的链接。


5
注意,rename在不同的系统上并不总是相同的,有时其语法也可能不同。

1
询问者现在补充说,他正在使用Solaris。因此,他无法使用此重命名命令(特定于Debian和衍生产品)。
吉尔斯(Gillles)“所以-别再作恶了”

1
...除非他设法从源头构建它。
sendmoreinfo

@Gilles perl-rename完全不特定于Debian。它只是不叫rename,但perl-rename还是prename在其他分布。不过,它应该始终位于存储库中,并且还应与perl一起安装
terdon

@terdon 重命名其基本用法是perl表达式的文件的命令并不特定于Debian。这样的命令被调用rename并且很可能在不显式请求不被称为just的软件包的情况下被安装rename,它特定于Debian。其他Linux发行版会调用该命令,prename或者perl-rename避免与util-linux混淆,rename并且不要将其与perl软件包捆绑在一起,而且我不知道有任何非Linux Unix以该名称rename或以默认安装的任何名称。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.