我有數百個資料夾,其中有數千個子目錄和文件。檔案名稱目前的格式為
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 來刪除它們。