用於修復檔案名稱的 Bash 腳本

用於修復檔案名稱的 Bash 腳本

我有數百個資料夾,其中有數千個子目錄和文件。檔案名稱目前的格式為

sf{number}-{number} - {text}

我需要刪除 {text} 之前的所有內容。

例子:

sf012-05 - toto - africa.cdg 
sf012-05 - toto - africa.mp3

->

toto - africa.cdg
toto - africa.mp3

附加格式:

SF-108 - 02 Johnny Hates Jazz Shattered Dreams[K].cdg
02 - David Essex - Rock On.cdg
SF0504 - 13 Walker Brothers, The  Make It Easy On Yourself.cdg
SFLY 051 - 07 America  A Horse With No Name.cdg
SF217-12 this love - maroon 5.cdg
SF262-13. Same Mistake - James Blunt.cdg
SF287 - 13 Luke Bryan Do I.cdg
SF355-01-15 - Tough Love - Pony.cdg
Track 11 Livin' La Vida Loca (Radio Edit) - Martin, Ricky.cdg
Sunfly Hits 275 - 07 SF275-7-Right Now (Na Na Na)-Akon.mp3
Second, Minute Or Hour - Jack Penate.mp3
SF057 - Karaoke Classics Vol.57 - 03 Abba Thank You For The Music.cdg

尤其是最後一張簡直就是垃圾。

這意味著我需要一個遞歸正規表示式 bash 腳本或類似的東西來瀏覽這些檔案並重新命名它們。

答案1

如果您有基於 Perl 的rename實用程式(prename在某些發行版上呼叫),您可以使用正規表示式一次重新命名所有檔案。

您的要求要求刪除,sf{number}-{number}但所有範例均以大寫字母開頭,其中一些僅包含一個{number}, {number}-{number}-{number}, 甚至{number}{space}-{space}{number}。我假設您想要包括前兩種情況。

rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*

-n當您準備好應用其變更時,請刪除,或將其變更-v為以查看其處理文件的過程。

答案2

這裡最簡單的工具是桀騁(就像 bash,只是更好),及其奇特的通配符zmv功能。從要重新命名檔案的頂級目錄執行此命令。

autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'

說明:**/是任何前導目錄字串。然後是一種模式sf(不區分大小寫),後面跟著一個或多個數字、破折號和另一個數字,然後是破折號和空格。最後可以有任何後綴*。替換中的數字指的是模式中括號內的組。


或者,您可以使用prename(基於 Perl 的重新命名腳本,在 Debian 和 Arch Linux 上可用,在其他發行版上可能需要單獨安裝)。您需要將其與find收集要重新命名的文件清單結合。如果傳遞不匹配的檔案並不重要rename,它會跳過不需要重新命名的檔案。

find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +

答案3

這是程式碼(將目錄替換為主目錄,或您擁有子目錄的位置):

cd directory
find -type f | while IFS= read - file; do 
    name=$(echo "$file"  | rev | cut -d'/' -f1 | rev |  cut -d'-' -f3- | cut -d' ' -f2-) 
    path=$(dirname "$file")  
    newname="${path}/${name}"
    echo mv "$file" "$newname" 
done

其中目錄是主目錄,所有子目錄都在......

請不要刪除“mv”中的“echo”,先測試一下。

小心不要在錯誤的目錄中運行它,這可能非常危險。

答案4

你說你需要刪除所有內容,直到{text},但你的例子並沒有顯示這一點。我不展示確切的程式碼,而只是提出一個計劃。

1)寫一個腳本來完成你想要的事情文件名。像這樣的事情可能會做:

#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'

這會破壞模式“-”上的名稱並列印最後一個欄位。並保存原始文件名,以便在出現問題時可以檢索它。測試幾次,然後用它mv來恢復名稱。

2) 呼叫你的腳本尋找:

$ find dirname -exec script.awk {} +

這將使您的機器被許多腳本的平行呼叫所淹沒。完成後,您將有一堆可以刪除的目錄,並且您將知道如何使用 find 來刪除它們。

相關內容