在Bash中重命名多个文件

4

我在某个目录中有 A.js, B.js, C.js 这几个文件,我想要编写一个单行命令在 bash shell 中将这些文件重命名为 _A, _B, _C。该如何操作?

我尝试过 find -name '*.sh' | xargs -I file mv file basename file .sh 但它无法工作,因为basename file .sh没有被识别为一个嵌套命令。


我尝试使用以下命令:find -name '*.sh' | xargs -I file mv file basename file .sh,但它无法正常工作,因为“basename file .sh”不被识别为嵌套命令。 - andPat
3
欢迎来到stackoverflow。请阅读常见问题解答,可能还要看一下http://whathaveyoutried.com,然后编辑您的问题。 - pdu
我读了那篇文章,你说得对,文章的作者也是对的。但是如果你必须解决10个问题,其中一个问题的解决方案会带来一个新问题(在我的情况下是重命名这些文件),而且时间非常紧迫(因为你的老板正在等待所有10个问题的解决方案),你会直接要求解决方案还是解决方法?后者可能更好,但如果时间非常紧迫呢?我认为有时候只要求解决方案是必要的。 问候和感谢您向我指出这个问题。 - andPat
3个回答

8
如何呢?
rename 's/(.*).js/_$1/' *.js

请检查您系统上的重命名语法。

以上命令将把A.js重命名为_A等等。

如果您想保留扩展名,请执行以下操作:

rename 's/(.*)/_$1/' *.js

+1 是因为重命名是一个好工具。顺带一提,它是用 Perl 编写的,因此语法在各个系统上都是统一的。http://search.cpan.org/~rmbarker/File-Rename-0.06/rename.PL - msw
@msw:不,语法可能会有所不同。我见过的语法是'rename "from_regex" "to_string" files_filter'而不是rename 's/from_regex/to_string/' files_filter - anishsane

4
假设您仍希望在文件名中保留扩展名,可以这样做:
$ for f in * ; do mv "$f" _"$f" ; done

它将获取目录中每个文件的名称,并在前面添加“_”。

如果我理解他的意思正确,他也想删除文件扩展名。 - pdu
2
非常感谢!我按照以下方式修改了代码: for f in * ; do mv "$f" "_$(basename $f .sh)" ; done 现在它可以正常工作了! - andPat
@user1703524 非常好!我正准备以非常类似于你刚才所做的方式编辑帖子。很高兴它能够工作。 - Memento Mori

0

一种简单的本地方法,使用目录遍历

find -type f | xargs -I {} mv {} {}.txt

将每个文件重命名为在末尾添加扩展名 .txt 的形式。

还有一种更通用的酷方法,使用并行化

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}change_between${f:8}'

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