递归地从文件名中删除数字和连字符

递归地从文件名中删除数字和连字符

我正在修改一个简单的 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

相关内容