2015-09-16 48 views
2

我是專業音樂人,經常需要重命名20-30 .PDF文件的列表,以便按照得分順序排序。舉例來說,我有文件,如列表:使用Bash以Score命令重命名文件

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腳本來查找文件這個 訂單:

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

我不知道如何在此基礎上重新命名序列中的文件。誰能幫忙?

+0

什麼是「得分順序」? – erip

+0

@erip我認爲'scoreorder.txt'定義了這一點,儘管並不完整。 – tripleee

+1

你有'喇叭'和'法國號角'嗎?是否有其他條目是彼此的子串? – tripleee

回答

1

假設你在目錄中沒有不相關的文件,可能是這樣的。

要獲取所有PDF文件的列表,只需要printf一個匹配的glob。

printf '%s\n' *.pdf 

讓我們管的是一個awk腳本從scoreorder.txt這些映射到一個索引號。首先,將文件讀入數組a,併爲每個條目指定一個數字索引。

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

當我們讀到scoreorder.txtNR==FNR將是真實的;該腳本的其餘部分將應用於我們從標準輸入讀取的行,從上面的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 | 

現在我們只需要對行和後處理進行編號以刪除「原始排序」數字。

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

此時的排序順序依然是微客 - 第二Horn文件名EDIT吹的排序順序。也許你只是想解決你的命名約定,或者你想在.pdf之前選擇最後的數字作爲第二排序鍵。

輸出結果是一段shell腳本,只要您確信它完成了應該做的事情,您就可以將它輸送到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