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

Ste*_*vis 7 bash scripts

我正在修改一个简单的 BASH 脚本以从我的 MP3 文件的开头删除数字和连字符。目的是重命名文件,例如:

  • 11首歌曲1.mp3
  • 1-1-Song 2.mp3
  • 11-1 歌曲 3.mp3

到:

  • 歌曲 1.mp3
  • 歌曲 2.mp3
  • 歌曲 3.mp3

我有这个脚本适用于当前目录中的所有文件

$ for f in [0-9]*; do mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`"; done
Run Code Online (Sandbox Code Playgroud)

并修改它以查找子文件夹中的所有文件:

#!/bin/bash

dir=''

IFS='
'
for f in $(find $dir * -type f) ; do
  mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`"; 
done
Run Code Online (Sandbox Code Playgroud)

问题是该$f值返回子文件夹和文件名,该mv行查找以 [0-9] 开头的文件,因此子文件夹中的任何文件都不会被重命名。

例如文件mp3/1-1 Song 1.mp3开始mp3/,不以数字开头,所以它没有重命名。

有没有办法可以将目录和文件值读取到单独的变量中,或者有更好的方法吗?

谢谢

Gur*_*uru 4

find & sed:我会要求你首先删除最后的管道和 sh,并查看 mv 命令是否正确生成,然后你可以运行命令,如下所示:

find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\1\2\"|' | sh
Run Code Online (Sandbox Code Playgroud)