2015-09-16 2 views
2

Я профессиональный музыкант и вам часто нужно переименовывать списки файлов 20-30 .PDF, чтобы они сортировались в порядке счета. Например, у меня есть список файлов, таких как:Переименовать файлы в порядке счета с помощью Bash

Rolling Thunder Eb Clarinet - 4p.PDF 
Rolling Thunder Flute 1 - 4p 
Rolling Thunder Flute 2 - 4p 
Rolling Thunder FULL SCORE - CONDENSED - 20p 
Rolling Thunder Horn in F 1 - 3p 
Rolling Thunder EDIT 9-7-15 Horn in F 2 - 3p 
... 

и мне нужно их переименовали, чтобы они своего рода (в Finder) в порядке их появления в надреза, а именно:

00 - Rolling Thunder FULL SCORE - CONDENSED - 20p 
01 - Rolling Thunder Flute 1 - 4p 
02 - Rolling Thunder Flute 2 - 4p 
... etc. 

Я пошел по этому поводу путем создания текстового файла (так что порядок может быть изменен по мере необходимости для различных контекстов), содержащего порядок инструментов, такие как:

Piccolo 
Flute 
Oboe 
Clarinet 
Bassoon 
French Horn 
... 

, а затем начал скрипт Bash, чтобы найти файлы это ord er:

while read line; do 
find . -name "*$line*" 
done < scoreorder.txt 

Я не уверен, как это сделать, чтобы переименовать файлы в последовательности. Может ли кто-нибудь помочь?

+0

Что такое "порядок оценки"? – erip

+0

@erip Я думаю, что 'scoreorder.txt' определяет это, хотя и не полностью. – tripleee

+1

У вас есть как «Рога», так и «Французский рог»? Существуют ли другие записи, которые являются подстроками друг друга? – tripleee

ответ

1

Предполагая, что в каталоге нет несвязанных файлов, возможно, что-то вроде этого.

Чтобы получить список всех PDF-файлов, просто введите printf подходящий глобус.

printf '%s\n' *.pdf 

Давайте трубы, что к сценарию Awk, который отображает их на номер индекса из scoreorder.txt. Сначала прочитайте файл в массиве a с числовым индексом для каждой прочитанной записи.

awk 'NR==FNR { a[++n] = $0; next } ...' scoreorder.txt - 

NR==FNR будет справедливо, когда мы читаем scoreorder.txt; остальная часть скрипта будет применена к строкам, которые мы читаем со стандартного ввода, из printf выше.

... { m=0; 
    for(i=1; i<=n; ++i) 
     if ($0 ~ a[i]) 
      if (m==0 || length(a[m]) < length(a[i])) m=i; 

В каждой строке, мы выбираем из индекса из самого длинного матча (так French Horn имеет приоритет над Horn независимо от того, где они находятся в индексе). Если совпадения нет, m будет 0.

printf("%i\t%s\n", m, $0); }' 

Это произведет «сырой вид», где FULL SCORE будет иметь префикс 00 (потому что он не соответствует ни одному ключевому слову) и, например, файлы Flute будут иметь префикс 02. Этого достаточно, чтобы отсортировать список.

| sort -n | 

Теперь нам нужно просто пронумеровать строки и выполнить последующий процесс, чтобы удалить номера «raw sort».

awk -F '\t' '{ printf "mv \"%s\" \"%02i - %s\"\n", $2, NR, $2 }' 

порядок сортировки на данный момент все еще немного Выключен - EDIT во втором Horn имя файла выдувает порядок сортировки. Возможно, вы просто хотите исправить свое соглашение об именах или, возможно, хотите получить окончательное число до .pdf в качестве вторичного ключа сортировки.

Вывод представляет собой фрагмент сценария оболочки, который вы можете пропустить до sh, как только вы убедитесь, что он делает то, что он должен делать. Вот еще окончательный сценарий.

printf '%s\n' *.pdf | 
awk 'NR==FNR { a[++n] = $0; next } 
    { m=0; 
     for(i=1; i<=n; ++i) 
      if ($0 ~ a[i]) 
       if (m==0 || length(a[m]) < length(a[i])) m=i; 
    printf("%i\t%s\n", m, $0); }' scoreorder.txt - | 
sort -n | 
awk -F '\t' '{ printf "mv \"%s\" \"%02i - %s\"\n", $2, NR, $2 }' 

Если у вас есть имена файлов, которые содержат двойные кавычки, табуляции или новой строки, это будет получить намного сложнее. Я просто предположил, что нет.

+0

Это настолько полезно, и намного дальше, чем я получал в течение нескольких дней после выполнения этой задачи (я довольно новичок в этом) Спасибо! Однако я забыл упомянуть, что в каждой группе инструментов обычно есть несколько частей, поэтому в файлах будут называться такие вещи, как «.... Флейта 1», «... Флейта 2» и т. Д., Прежде чем идти на следующий инструмент и, возможно, в количествах, которые будут отличаться от одного инструмента/счета к другому. Любые предложения по обращению с этим, кроме того, что они помещаются в файл scoreorder.txt? Тем временем я собираюсь изучить код, который вы мне предоставили. – NFB

Смежные вопросы