我正在修改一个简单的 BASH 脚本,以从我的 MP3 文件开头删除数字和连字符。目的是重命名如下文件:
- 11歌曲1.mp3
- 1-1-歌曲2.mp3
- 11-1 第3首.mp3
到:
- 歌曲1.mp3
- 第二首.mp3
- 第三首.mp3
我有这个脚本,它适用于当前目录中的所有文件
$ for f in [0-9]*; do mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`"; done
并对其进行了修改,以查找子文件夹内的所有文件:
#!/bin/bash
dir=''
IFS='
'
for f in $(find $dir * -type f) ; do
mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`";
done
问题在于,该$f
值返回子文件夹和文件名,并且该mv
行查找以 [0-9] 开头的文件,因此子文件夹中的任何文件都不会被重命名。
例如,文件mp3/1-1 Song 1.mp3
以 开头mp3/
,不是以数字开头,因此不会被重命名。
有没有办法将目录和文件值读入单独的变量中,或者有更好的方法吗?
谢谢
答案1
find & sed:我要求您首先删除末尾的管道和 sh,然后查看 mv 命令是否正确生成,然后您可以按如下方式运行该命令:
find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\1\2\"|' | sh
答案2
没有必要使用脚本,只有一行代码即可。
尝试一下这个看看它能做什么(不要担心,这还不会重命名你的文件,见下文):
find root_audio_path -type f -iname '*mp3' -execdir rename --no-act 's/^\.\/[\d\s\-]+/\.\//' '{}' ';'
--no-act
如果看起来有效,请删除。这实际上重命名文件。
选项-execdir
确保在文件目录中find
执行rename
,因此文件路径总是以./
- 开头,我们在 中寻找它rename
。
rename
在 Ubuntu 中实际上是 perls 重命名,因此您可以在那里使用正则表达式。
答案3
下面将为你提供路径
echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)\(.*\)#\1#g'
/wwww/www/mp3/
下面将为你获取没有路径的文件:
echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)##g'
1-1 Song 1.mp3
您将需要一个用于路径、旧文件名和新文件名的变量。您可以使用代码获取新文件名,并使用这些变量构建源路径和目标路径。我建议进行一次试运行,将目标回显到文件附加部分。然后您可以检查 d