Переименуйте один набор файлов на основе имени, которое соответствует другому набору, с помощью порядка сортировки на основе размера файла для соответствия именам файлов. Файлы от обоих наборов имеют приблизительно те же размеры. Достаточно близко это при сортировке по размером файла оба списка находится в том же порядке. Количество файлов в каждом наборе является точно тем же.
Первый файл установил:
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
Второй файл установил:
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
Как делают Вы переименовываете первый набор следующим образом:
06-Groove_de_V..flac
08-Jump.flac
01-Do_You_Savvy.flac
05-Gershwins_Blues.flac
02-Blue_Skies.flac
До сих пор...
master~$ for f in $(ls -S); do
IDX=$(echo $f | awk '{print substr( $1, 1, 2 )}');
echo "mv $i $IDX-";
done
Производит:
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-
Спасибо!
Некоторые модификации к Вашему сценарию, избавляющему от необходимости AWK и упрощающему постепенное увеличение индексной переменной. Это также теперь правильно обработает имена файлов, которые включают пробелы.
#!/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)