如何在bash中批量重命名文件?

Nat*_*ong 9 bash

我有一些这样的文件:

database1-backup-01-01-2011.sql
database2-backup-01-01-2011.sql
Run Code Online (Sandbox Code Playgroud)

...等等。我想重命名它们以添加 AM,如下所示:

database1-backup-01-01-2011-AM.sql
database2-backup-01-01-2011-AM.sql
Run Code Online (Sandbox Code Playgroud)

从 bash shell 执行此操作的最简洁方法是什么?

chr*_*ish 20

另外一个选项:

for i in *.sql ; do
    mv -v $i ${i%.sql}-AM.sql
done
Run Code Online (Sandbox Code Playgroud)

这将遍历所有 .sql 文件并将它们重命名为以 -AM.sql 结尾。

普罗蒂普:使用$(command)的,而不是`command`在脚本(和命令行),它使引号和转义噩梦的少。


Maj*_*nko 7

试试这个小脚本:

#!/bin/sh

FILES=`ls *.sql`
for FILE in ${FILES}
{
    BASE=`basename ${FILE} .sql`
    mv ${FILE} ${BASE}-AM.sql
}
Run Code Online (Sandbox Code Playgroud)

我只是从内存中输入,所以如果它 100% 不起作用,请不要怪我(即,先备份您的数据;))

这个怎么运作:

将所有文件收集到一个变量中(您可以将其放在 for 中,但我希望使内容易于阅读):

FILES=`ls *.sql`
Run Code Online (Sandbox Code Playgroud)

循环遍历每个文件:

for FILE in ${FILES} { ... }
Run Code Online (Sandbox Code Playgroud)

获取不带 .sql 的文件名:

BASE=`basename ${FILE} .sql`
Run Code Online (Sandbox Code Playgroud)

重命名文件,将 -AM.sql 添加到基本名称:

mv ${FILE} ${BASE}-AM.sql
Run Code Online (Sandbox Code Playgroud)

  • 您可以删除行 `FILES=\`ls *.sql\`` 并将 `${FILES}` 替换为 `*.sql`,shell 扩展将负责查找文件。 (2认同)
  • 好吧,请原谅我编写可移植的代码。`ls..` 只是脚本可以处理的文件源之一;只需编辑此变量即可将其更改为使用预定义的文件列表或命令行参数。如果要将脚本用于其他用途,则无需更改 for 的结构。这不是这个网站的重点吗?给出大众感兴趣的答案?如果这意味着让您的脚本更加冗长且易于理解,那么我认为 `ls..` 没有问题,因为它隐含地显示了正在处理的内容。 (2认同)

Den*_*son 5

使用Perl 脚本版本rename

rename 's/\.sql$/-AM$&/' *.sql
Run Code Online (Sandbox Code Playgroud)

使用以下util-linux-ng版本rename(但仅当“.sql”仅出现在文件名末尾时):

rename .sql -AM.sql *.sql
Run Code Online (Sandbox Code Playgroud)

使用mmv

mmv '*.sql' '#1-AM.sql'
Run Code Online (Sandbox Code Playgroud)