bash - 如何在不删除文件名的扩展点的情况下重命名
问题描述
为了用 .wav 和 .flac 扩展名重命名音乐样本,我使用了这一行:
for f in * ; do rename 's/[^a-zA-Z0-9:0:4]//g' "$f" ;done
但是会发生什么,当文件的名称是这样的时:
name * of ( the f?ile.wav
它成为了:
nameofthefilewav
它应该是:
nameofthefile.wav
我需要什么才能在他的位置上获得扩展点?
解决方案
您可以使用basename
和参数扩展来获取文件名及其扩展名。
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
答案取自这里
编辑:
bash-4.1$ ls
1.mp3 2.mp3 3.mp3
bash-4.1$ for f in `ls`; do
filename=$(basename -- "$f")
extension="${filename##*.}"
filename="${filename%.*}"
echo "FROM: $filename.$extension TO: $filename.wav"
done
FROM: 1.mp3 TO: 1.wav
FROM: 2.mp3 TO: 2.wav
FROM: 3.mp3 TO: 3.wav
推荐阅读
- list - JPA/Hibernate - 一对多列表与集合优化
- prometheus - 实现 prometheus_client.multiprocess.MultiProcessCollector 的正确方法(Django + Celery)
- node.js - Knex.js - 节点进程永远不会退出,如何优雅地关闭它 - 但只有在所有查询都得到解决时?
- c++ - cmake mingw-w64:尝试构建时出现奇怪的错误
- android - 在 firebase 数据库中搜索返回空值
- java - 如何将编译好的 Groovy 脚本存储在数据库中,并在需要时获取?
- python - 如何将“字符串”输出转换为 JSON 格式的数字输出?
- javascript - 如何在画布动画的 While 循环的每次迭代之间添加延迟?
- docker - 通过 docker-compose 对其他计算机进行 sshfs 的最佳实践,但不想公开公开端口
- azure - 在 Azure 文件共享中存储按上次修改日期排序的文件