使用 bash 重命名包含空格和正则表达式的文件

use bash to rename a file with spaces and regex

如果我有一个包含空格和一组随机数字的文件名,如下所示:

file name1234.csv

我想将它重命名为这个(假设之前指定了日期):

file_name_${date}.csv

我可以这样做:

mv 'file name'*'.csv file_name_${date}.csv

但是在'file name*.csv'其实可以匹配多个文件的情况下,我想指定为'file name[random numbers].csv'

我搜索了一圈,没有找到任何相关的答案。

使用扩展的 Glob 和参数扩展

您可以使用 Bash extended globs and a few parameter expansions 做您想做的事,而无需借助外部或非标准实用程序。

date="2016-11-21"

shopt -s extglob
for file in 'file name'+([[:digit:]]).csv; do
    newfile="${file%%[0-9]*}"
    newfile="${newfile// /_}"
    mv "$file" "${newfile}_${date}.csv"
done

您需要一个 "pathname expansion" 来匹配一个或多个数字:

+([0-9])

功能脚本可能是这样的:

date=$(date +'%Y-%m-%d')

shopt -s extglob nullglob

for f in 'file name'+([[:digit:]]).csv; do
    file="${f%%[0-9]*}"
    echo mv "$f" "${file// /_}_${date}.csv"
done

警告:找到的所有文件都将重命名为一个名称,在删除 echo 之前确保这是您想要的名称。

要激活 "Pathname Expansion" 的扩展版本,我们使用 shopt -s extglob
为了避免没有文件匹配的情况,我们还需要设置nullglob
我们可以将位置参数设置为上述扩展的结果。
然后我们遍历找到的所有文件以更改它们的每个名称。
${f%%[0-9]*} 删除所有数字到末尾。 ${file// /_} 用下划线替换空格。
由于 echo.

mv 实际上并未使用提供的脚本完成

如果在 运行 测试之后,您希望执行更改,请删除 echo