首页 > 解决方案 > 如何同时重命名和覆盖 Bash 中的部分文件名?

问题描述

我在文件夹中有多个 JS 文件,例如foo.jsthis_is_foo.jsfoo_is_function.js

我想在扩展名“.js”前面附加一个作为参数传递的数字,例如foo.1.jsthis_is_foo.1.jsfoo_is_function.1.js

我第一次编写了一个脚本来成功追加一个数字,但是如果我运行该脚本两次,它不会覆盖第一个数字,而是在之后立即追加。

实际结果:foo.js --> foo.1.js(第一次运行)--> foo.1.2.js(第二次运行)。

预期结果:foo.js --> foo.1.js(第一次运行)--> foo.2.js(第二次运行)。

这是我的脚本:

#!/bin/sh
param=$1
for file in *.js; do
    ext="${file##*.}";
    filename="${file%.*}";
    mv "$file" "${filename}.${param}.${ext}";
done

我怎样才能做到这一点?我想编写纯 bash 脚本,而不是使用任何工具。

标签: bashfile-rename

解决方案


在进行重命名之前,您可以检查文件名 ( ${filename%.*}) 中最后一个点之后的内容是否为数字。如果是这样,用参数切换它而不是附加一个新参数

由于您正在写要使用纯 bash,因此我认为可以将 shebang 更改为#!/bin/bash

#!/bin/bash
param=$1
for file in *.js; do
    ext="${file##*.}";
    filename="${file%.*}";

    # Check if what is after the last dot in filename is numeric
    # Then assume that it should be switched to param
    if [[ ${filename##*.} =~ ^[0-9]+$ ]]; then
        mv "$file" "${filename%.*}.${param}.${ext}"

    ## Else add param
    else
        mv "$file" "${filename}.${param}.${ext}"
    fi  
done

测试运行

$> touch a.js && find -type f -name *.js && \
 ./test.sh 1 && find -type f -name *.js && \
 ./test.sh 2 && find -type f -name *.js

./a.js
./a.1.js
./a.2.js

推荐阅读