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)して操作を実行します。 2番目のインスタンスでは、echo変更を適用できるように最初のインスタンスを削除します。

答え3

7文字の長さのデフォルト名を使用して、各mp3のsedコマンドラインを作成できます。mv

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

出力を見た後、ファイルにリダイレクトして実行できます。

関連情報