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

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

在基本目录中我有这样的文件夹:

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

这也不适用于子目录,只是文件位于基本目录中

答案1

我不建议只收集所有与 *.mp3 匹配的文件,然后修剪文件名。您可能想稍后再次运行相同的脚本(例如下周),并且它不应该尝试再次重命名相同的文件,从而使它们变得更短并且存在命名冲突。

您的示例文件名似乎是001xyz1.mp3你想要xyz.mp3

     KEEP_DIR=$PWD 
     cd /your/music/base_dir        # sub-dirs holding .mp3

     RCOUNT=0 ; SKIP=0 ; FCC=0


 for FFF in */001???1.mp3    
     do
     LOC="$(dirname $FFF)"   
     BAS="$(basename $FFF)"
     TRIM1="${BAS#1.mp3}"     #could use ${BAS:4:3}
     NEWF="$LOC/${TRIM1%001}.mp3"
     if [ -e "$NEWF" ] ; then
        echo "#-- File $NEWF already exists, not renaming $FFF"
        SKIP=$((SKIP+1))
     else
        mv $FFF $NEWF
        MCOUNT=$((MCOUNT+1))
     fi
     FCC=$((FCC+1))
 done

 echo "Renamed $MCOUNT mp3 files, of $FCC found. (Skipped $SKIP)"
 cd $KEEP_DIR

 #--[eof]

答案2

如果您有rename(有时称为prename),您可以通过一个命令执行此操作:

rename -n 's!(.*/)...(.*).(\.mp3)!$1$2$3!' */?????*.mp3

或者,您可以循环遍历文件:

for f in */?????*.mp3
do
    echo mv -v "$f" "$(echo "$f" | sed -r 's!(.*/)...(.*).(\.mp3)!\1\2\3!')"
done

在第一个实例中,删除-n(或替换为-v)以使其执行工作。在第二个实例中,删除第一个实例echo以允许其应用更改。

答案3

您可以使用7 个字符长的基本名称为每个 mp3sed创建一个命令行:mv

$ find . -name "???????.mp3" | sed 's/\(.*\)\(...\)\(...\)\(.\)\(\.mp3\)/mv \1\2\3\4\5 \1\3\5/'

查看输出后,您可以将其重定向到文件中并执行。

相关内容