2

Фон

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

проблема

Первый набор файлов:

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-

Спасибо!

1 ответ1

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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .