Regex 更改文件名的Bash脚本

Regex 更改文件名的Bash脚本,regex,bash,Regex,Bash,我有以下格式的文件:ddmmyyyyRANDOM.mp3 我想将它们重命名为:yyyy-mm-dd-RANDOM.mp3 RANDOM是一个可以包含空格的随机字符串。 不是家庭作业问题。我在这里被打动了,我试过各种正则表达式,但都没发现。我需要编写bash脚本尝试以下操作: FILE="23022014hello world.mp3" mv "$FILE" "$(echo "$FILE" | sed 's/\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{4\}\)\(.

我有以下格式的文件:
ddmmyyyyRANDOM.mp3

我想将它们重命名为:
yyyy-mm-dd-RANDOM.mp3

RANDOM
是一个可以包含空格的随机字符串。 不是家庭作业问题。我在这里被打动了,我试过各种正则表达式,但都没发现。我需要编写bash脚本

尝试以下操作:

FILE="23022014hello world.mp3"
mv "$FILE" "$(echo "$FILE" | sed 's/\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{4\}\)\(.*\)/\3-\2-\1-\4/')"

它将前2个数字、后2个数字、后4个数字和剩余的字符分别剪切,并根据您的要求进行排列。

我将使用子字符串的方法将其拆分

 filename="ddmmyyyyRANDOM.mp3"
part1=${filename:0:8} #this should get you ddmmyyy
part2=${filename:9:6} #this should get you RANDOM
filenamenew=$part1$part2".mp3"
mv $fileneme $filenamenew
如果文件名超过1个,则在循环中运行,请尝试以下操作:

for file in *; do
    new=$(echo "$file" | sed -r 's/^([0-9]{2})([0-9]{2})([0-9]{4})(.*)$/\3-\2-\1-\4/')
    mv "$file" "$new" 
done

关于regex的更多信息

使用
重命名
实用程序

touch 12021960RANDOM.mp3 "01041973 random with spaces.mp3"

$ rename -n 's/^(\d{2})(\d{2})(\d{4})/$3-$2-$1-/' *.mp3
01041973 random with spaces.mp3 renamed as 1973-04-01- random with spaces.mp3
12021960RANDOM.mp3 renamed as 1960-02-12-RANDOM.mp3

当您对输出感到满意时,删除
-n
部分以实际执行重命名

看一看perl
重命名
实用程序,它具有perl regexps的所有强大功能
RANDOM
很好,订阅的随机非固定长度字符串在这里不起作用。如果您在开始时获得字符串的长度,则其可能的有效部分将是总长度-8-4(-4,因为.mp3是4个字母)