寻找 Bash 循环命令重命名文件目录,在破折号前后插入空格

Looking for a Bash loop command to rename a directory of files, inserting a whitespace before and after a dash

我有一个包含以下文件的目录:

01-artist name-song name 1.mp3
02-artist name-song name 2.mp3
03-artist name-song name 3.mp3
etc.

我正在寻找一个循环命令来重命名文件,因此它们变成:

01 - artist name - song name 1.mp3
02 - artist name - song name 2.mp3
03 - artist name - song name 3.mp3
etc.

基本上,我需要在每个破折号前后插入一个空格。 谢谢你的帮助。

在简单的 bash 中,一个 for 循环就可以完成工作:

for file in ./*-*.mp3; do mv "$file" "${file//-/ - }"; done

使用 ${file//-/ - },参数 file 扩展中的所有 - 实例都替换为 - 。请注意,上面的代码片段将在 - 周围插入空格,即使它已经插入空格也是如此。如果不需要,可以使用下面的代码。

#!/bin/bash

shopt -s extglob
for file in ./*-*.mp3; do
    newname=${file//-/ - }
    newname=${newname//+([[:blank:]])/ }
    [[ $file != "$newname" ]] && mv "$file" "$newname"
done

参数展开${newname//+([[:blank:]])/ }用来挤空格。这需要设置 extglob 选项。

使用 Perl 的独立 renameprename 命令:

rename -n 's/-/ - /g' *.mp3

输出:

rename(01-artist name-song name 1.mp3, 01 - artist name - song name 1.mp3)

如果一切正常,请删除 -n