Linux 从所有子目录中的所有mp3文件中删除前3个字符和最后1个字符

Linux 从所有子目录中的所有mp3文件中删除前3个字符和最后1个字符,linux,bash,Linux,Bash,在基本目录中,我有如下文件夹: 1 2 3 4 5 10 110 所以在每一本书中我都有这样的文件 0010011.mp3 0010031.mp3 0010051.mp3 0010071.mp3 0010021.mp3 0010041.mp3 0010061.mp3 所以我想删除前3个字符和最后1个字符,这样文件看起来就像这样 001.mp3 003.mp3 005.mp3 007.mp3 002.mp3 004.mp3 006.mp3 我试过这个

在基本目录中,我有如下文件夹:

1
2
3
4
5
10
110
所以在每一本书中我都有这样的文件

  0010011.mp3  0010031.mp3  0010051.mp3  0010071.mp3  0010021.mp3  0010041.mp3  0010061.mp3
所以我想删除前3个字符和最后1个字符,这样文件看起来就像这样

 001.mp3   003.mp3   005.mp3   007.mp3   002.mp3   004.mp3  006.mp3
我试过这个

for file in ??????*; do echo mv $file `echo $file | cut -c4-`; done

此外,这在子目录中不起作用,只是如果文件在基本目录中,您可以使用此while循环:

cd /base/dir

while IFS= read -rd '' file; do
   echo mv "$file" "$(sed -E 's~(.*/).{3}(.+).\.~\1\2.~' <<< "$file")"
done < <(find . -type f -print0)
cd/base/dir
而IFS=read-rd“”文件;做

echo mv“$file”“$(sed-E的~(.*/).{3}(+).\.~\1\2.~'如果文件名都具有相同的模式,则可以按以下方式剪切字符:

$ file='0010031.mp3'
$ cut -c4-6,8- <<< "$file"
003.mp3
$file='0010031.mp3'

$cut-c4-6,8-mv./36/0360331.mp3./033.mp3 mv./4/0041091.mp3./09.mp3它应该是mv./4/0041091.mp3./009.mp3如果文件夹名有1个字符,它将重命名为mv./8/0080351.mp3./35.mp3如果文件夹名有2个字符,它将重命名为mv./88/0080351.mp3./035.mp3。它应该从文件名中删除3个字符(不包括目录)对于$(find.-type f-print0)中的i,这个答案中的语法是否优于
;是否以某种方式echo mv$i[etc];done
?我需要在基本目录中运行,但要应用于每个子目录,只需使用
basename
+
dirname