bash - 如何同时重命名和覆盖 Bash 中的部分文件名?
问题描述
我在文件夹中有多个 JS 文件,例如foo.js、this_is_foo.js、foo_is_function.js。
我想在扩展名“.js”前面附加一个作为参数传递的数字,例如foo.1.js,this_is_foo.1.js,foo_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 脚本,而不是使用任何工具。
解决方案
在进行重命名之前,您可以检查文件名 ( ${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
推荐阅读
- python - 我可以通过字典的键查询 MongoDB 吗?
- reporting-services - SSRS ODAC 客户端 TNS_Admin 配置
- scala - 如何拆箱任何类型的变量,其值可以是 Some(Some(值可以是整数或字符串))
- sql - ORACLE - 创建具有相同列名的多个表
- c++ - 尝试从不同类调用函数指针时出错
- javascript - 如何解决猫头鹰轮播在angularjs模板中不起作用
- javascript - 在 forEach 中调用 firebase 会使迭代不起作用
- c++ - Qt基于模板生成UI
- apache-zookeeper - 从 ZooKeeper 中找不到活动的 Drillbit 端点
- python - Python ML - 如何最好地拯救 python ml 值数组