重命名多个文件,但只重命名Bash中的部分文件名

use*_*029 47 bash file-rename

我知道如何重命名文件等,但我遇到了麻烦.

我只需要test-this在for循环中重命名.

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 
Run Code Online (Sandbox Code Playgroud)

Tim*_*ann 108

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

rename 's/test-this/REPLACESTRING/g' *
Run Code Online (Sandbox Code Playgroud)

结果将是:

REPLACESTRING.ext
REPLACESTRING.volume001+02.ext
REPLACESTRING.volume002+04.ext
...
Run Code Online (Sandbox Code Playgroud)

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

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

man sed有关标志的详细说明,请参阅.

  • 这命令在我的生命中一直在哪里?! (30认同)
  • 这不适用于 Fedora 25 中包含的重命名。我必须执行“rename test-this REPLACESTRING *”。有人知道要在 fedora 中安装哪个软件包才能获得答案中提到的重命名类型吗? (3认同)
  • 这种重命名实现依赖于版本,另一个答案显示了具有不同实现语法的相同命令. (2认同)
  • @Dylan `brew 安装重命名` (2认同)

dog*_*ane 46

使用rename如下所示:

rename test-this foo test-this*
Run Code Online (Sandbox Code Playgroud)

这将替换test-thisfoo在文件名.

如果您没有rename使用for如下所示的循环:

for i in test-this*
do
    mv "$i" "${i/test-this/foo}"
done
Run Code Online (Sandbox Code Playgroud)

  • 注意,这是[util-linux`rename`](http://man7.org/linux/man-pages/man1/rename.1.html),而不是另一个答案中提到的Perl`rename`。 (2认同)
  • 这似乎是我的 Centos 发行版中包含的 be rename 命令。显然,另一个重命名对于 Linux 来说并不通用。 (2认同)

use*_*526 15

不使用rename

find -name test-this\*.ext | sed 'p;s/test-this/replace-that/' | xargs -d '\n' -n 2 mv
Run Code Online (Sandbox Code Playgroud)

其工作方式如下:

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

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

    A。打印 ( p) 一行。

    b. 将 ( s///)替换test-thisreplace-that并打印结果。

    C。转到下一行。

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

    A。将换行符视为分隔符 ( -d '\n')。

    b. 每次mv最多使用 2 ( ) 个参数重复调用。-n 2

对于试运行,请尝试以下操作:

find -name test-this\*.ext | sed 'p;s/test-this/replace-that/' | xargs -d '\n' -n 2 echo mv
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*ack 10

功能

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

rename() {
    for i in $1*
    do
        mv "$i" "${i/$1/$2}"
    done
}
Run Code Online (Sandbox Code Playgroud)

输入文件

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 
Run Code Online (Sandbox Code Playgroud)

命令

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 
Run Code Online (Sandbox Code Playgroud)

  • 如果你有Homebrew,你可以用`brew install rename`安装`rename` (12认同)