bash - 从不同路径批量重命名多个文件
问题描述
我有一个文件目录music/artist/{random_name}/{random_music}.ogg
里面有很多文件夹{random_name}
和不同类型的音乐标题{random_music}
。
所以,我想重命名{random_music}.ogg
为music.ogg
. 每个{random_name}
文件夹只有一个 .ogg 文件。
我已经尝试了几个小时的 Bash 脚本,但没有找到答案。
for f in ../music/artist/*/*.ogg
do
echo mv "$f" "${f/.*.ogg/music.ogg}"
done
它只重命名我当前目录上的文件,这将要求替换/覆盖。
我的目标是,我想将所有{random_music}.ogg
文件重命名为music.ogg
它们各自的目录,例如,
music/artist/arai/blue.ogg
到music/artist/arai/music.ogg
music/artist/sako/sky.ogg
到music/artist/sako/music.ogg
解决方案
您的模式替换不正确。因为您的所有路径都以..
,.*.ogg
实际上匹配整个路径,所以每个文件都被转换到music.ogg
您的当前目录中。
你想要${f/\/*.ogg/music.ogg}
,或者更好的是,${f%/*}/music.ogg
。这大致相当于"$(dirname "$f")"/music.ogg
.
推荐阅读
- android - 水平 RecyclerView 在编辑 EditText 时自动滚动
- python - 运行代码时出现未定义错误
- angular - ngOnInit 比 @Input 快
- html - 两个链接不显示
- ios - 增加自动更新订阅成本的正确方法是什么
- javascript - jquery/javascript 冲突错误,jquery 旧版本有问题
- google-cloud-platform - 更新我的项目的范围后,谷歌身份验证令牌会起作用吗?
- javascript - 为什么说我不能设置属性 fontSize 因为某些东西是未定义的?
- windows - 如何在不重定向到 WOW6432Node 的情况下使用 32 位 Powershell 访问 64 位注册表项
- laravel-5 - 在 2 模型中使用 try catch 时如何修复 laravel 中的回滚事务?