Renomear conjuntos de arquivos com base no tamanho

2

Antecedentes

Renomeie um conjunto de arquivos com base em um nome que corresponda a outro conjunto, usando uma ordem de classificação com base no tamanho do arquivo para corresponder aos nomes dos arquivos. Os arquivos de ambos os conjuntos têm aproximadamente os mesmos tamanhos. Perto o suficiente para que, quando classificadas por tamanho de arquivo, ambas as listas estejam na mesma ordem. O número de arquivos em cada conjunto é exatamente o mesmo.

Problema

Primeiro conjunto de arquivos:

master~$ for f in $(ls -S); do echo $f; done
06-AudioTrack_06.flac
08-AudioTrack_08.flac
01-AudioTrack_01.flac
05-AudioTrack_05.flac
02-AudioTrack_02.flac

Segundo conjunto de arquivos:

corrupt~$ for f in $(ls -S); do echo $f; done
Groove_de_V..flac
Jump.flac
Do_You_Savvy.flac
Gershwins_Blues.flac
Blue_Skies.flac
If_I_Had_A_Ribbon_Bow.flac

Pergunta

Como você renomeia o primeiro conjunto da seguinte forma:

06-Groove_de_V..flac
08-Jump.flac
01-Do_You_Savvy.flac
05-Gershwins_Blues.flac
02-Blue_Skies.flac

Script

Até agora ...

master~$ for f in $(ls -S); do
  IDX=$(echo $f | awk '{print substr( $1, 1, 2 )}');
  echo "mv $i $IDX-";
done

Produz:

mv 06-AudioTrack_06.flac 06-
mv 08-AudioTrack_08.flac 08-
mv 01-AudioTrack_01.flac 01-
mv 05-AudioTrack_05.flac 05-
mv 02-AudioTrack_02.flac 02-

Obrigado!

    
por Dave Jarvis 10.03.2011 / 10:20

1 resposta

1

Algumas modificações no seu script eliminam a necessidade do AWK e simplificam o incremento da variável de índice. Ele também irá agora lidar corretamente com nomes de arquivos que incluam espaços.

#!/bin/bash

index=0

# Store the names of original (corrupt) files
while read -r f
do
    corrupt[index++]=${f##*/}
done < <(ls -S "$1"/*.flac)

index=0

while read -r f
do
    idx=${f:0:2}
    original=${corrupt[index++]}
    echo mv "$f" "$idx-$original"
done < <(ls -S *.flac)
    
por 10.03.2011 / 16:08