Переименуйте наборы файлов на основе размера

Фон

Переименуйте один набор файлов на основе имени, которое соответствует другому набору, с помощью порядка сортировки на основе размера файла для соответствия именам файлов. Файлы от обоих наборов имеют приблизительно те же размеры. Достаточно близко это при сортировке по размером файла оба списка находится в том же порядке. Количество файлов в каждом наборе является точно тем же.

Проблема

Первый файл установил:

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-

Спасибо!

2
задан 10.03.2011, 11:20

1 ответ

Некоторые модификации к Вашему сценарию, избавляющему от необходимости 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)
1
ответ дан 12.12.2019, 00:17

Теги

Похожие вопросы