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]

おすすめ記事