重命名多个文件,但在 Bash 中仅重命名部分文件名

问题描述 投票:0回答:7

我知道如何重命名文件等,但我在这方面遇到了麻烦。

我只需要在for循环中重命名

test-this

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 
bash file-rename
7个回答
195
投票

如果您将所有这些文件都放在一个文件夹中并且您使用的是 Linux,则可以使用:

rename 's/test-this/REPLACESTRING/g' *

结果将是:

REPLACESTRING.ext
REPLACESTRING.volume001+02.ext
REPLACESTRING.volume002+04.ext
...

rename
可以将命令作为第一个参数。这里的命令由四部分组成:

  1. s
    :用另一个字符串替换一个字符串的标志,
  2. test-this
    :要替换的字符串,
  3. REPLACESTRING
    :要替换搜索字符串的字符串,以及
  4. g
    :一个标志,指示搜索字符串的所有匹配项都将被替换,即如果文件名是
    test-this-abc-test-this.ext
    ,则结果将是
    REPLACESTRING-abc-REPLACESTRING.ext

请参阅

man sed
了解标志的详细说明。


80
投票

使用

rename
,如下所示:

rename test-this foo test-this*

这会将文件名中的

test-this
替换为
foo

如果您没有

rename
,请使用
for
循环,如下所示:

for i in test-this*
do
    mv "$i" "${i/test-this/foo}"
done

30
投票

功能

我使用的是 OSX,我的 bash 没有

rename
作为内置函数。我在我的
.bash_profile
中创建了一个函数,它接受第一个参数,这是文件中只应该匹配一次的模式,并且不关心它后面的内容,并替换为参数 2 的文本。

rename() {
    for i in $1*
    do
        mv "$i" "${i/$1/$2}"
    done
}

输入文件

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 

命令

rename test-this hello-there

输出

hello-there.ext
hello-there.volume001+02.ext
hello-there.volume002+04.ext 
hello-there.volume003+08.ext 
hello-there.volume004+16.ext 
hello-there.volume005+32.ext 
hello-there.volume006+64.ext 
hello-there.volume007+78.ext 

15
投票

不使用

rename
:

find -name test-this\*.ext | sed 'p;s/test-this/replace-that/' | xargs -d '\n' -n 2 mv

其工作原理如下:

  1. find
    将会找到符合您条件的所有文件。如果您传递
    -name
    一个全局表达式,请不要忘记转义
    *

  2. 将换行符分隔的*文件名列表通过管道传输到

    sed
    ,这将:

    a.打印 (

    p
    ) 一行。

    b.将 (

    s///
    )
    test-this
    替换为
    replace-that
    并打印结果。

    c.转到下一行。

  3. 将新旧文件名交替的换行符分隔列表通过管道传输到

    xargs
    ,这将:

    a.将换行符视为分隔符 (

    -d '\n'
    )。

    b.每次最多使用 2 (

    mv
    ) 个参数重复调用
    -n 2

要进行空运行,请尝试以下操作:

find -name test-this\*.ext | sed 'p;s/test-this/replace-that/' | xargs -d '\n' -n 2 echo mv

*:请记住,如果您的文件名包含换行符,它将不起作用。


1
投票

将index.htm重命名为index.html

rename [what you want to rename] [what you want it to be] [match on these files]
rename .htm .HTML *.htm

将index.htm重命名为index.html 它将对文件夹中与 *.htm 匹配的所有文件执行此操作。


0
投票

如果您不太理解

xargs
,无法轻松执行此操作,请尝试以下操作:

for i in your_files_*
do
    mv $i ${i/your_files_/new_prefix_}
    # Use `echo ${i/your_files_/new_prefix_}` here first to confirm you got the pattern right
done

-2
投票

感谢您的热情和回答。我还找到了一个解决方案,可以在我的Linux终端上重命名多个文件并直接添加一个小计数器。这样我就有很好的机会获得更好的 SEO 名称。

这是命令

count=1 ; zmv '(*).jpg' 'new-seo-name--$((count++)).jpg'

我还制作了一个实时编码视频并将其发布到YouTube

© www.soinside.com 2019 - 2024. All rights reserved.