bash - remova os 3 primeiros caracteres e o último caractere de todos os arquivos mp3 em todos os subdiretórios

0

no diretório base eu tenho pastas como esta:

1
2
3
4
5
10
110

então em cada um deles eu tenho arquivos como

  0010011.mp3  0010031.mp3  0010051.mp3  0010071.mp3  0010021.mp3  0010041.mp3  0010061.mp3

então eu quero remover os 3 primeiros caracteres e o último caractere para que os arquivos tenham essa aparência

 001.mp3   003.mp3   005.mp3   007.mp3   002.mp3   004.mp3  006.mp3

eu tentei isso

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

também isso não está funcionando em subdiretórios, é apenas se os arquivos estiverem no diretório base

    
por arlind 27.04.2018 / 17:06

3 respostas

0

I would not advise just collecting all files that match *.mp3 and then trimming the file names. You MAY want to run this same script AGAIN later (like next week) and it should NOT try to rename the same files a second time, making them even shorter and have naming conflicts.

Your example file names seem to be 001xyz1.mp3 and you want 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]
    
por 03.05.2018 / 04:25
0

Se você tem rename (às vezes conhecido como prename ), pode fazer isso em um comando:

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

Como alternativa, você pode percorrer os arquivos:

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

Na primeira instância, remova -n (ou substitua-o por -v ) para que ele execute o trabalho. Na segunda instância, remova o primeiro echo para permitir que ele aplique as alterações.

    
por 27.04.2018 / 18:01
0

Você pode usar sed para criar uma linha de comando mv para cada mp3 com um nome de base de 7 caracteres:

$ find . -name "???????.mp3" | sed 's/\(.*\)\(...\)\(...\)\(.\)\(\.mp3\)/mv  /'

Depois de analisar a saída, você pode redirecioná-la para um arquivo e executá-la.

    
por 03.05.2018 / 09:56

Tags