
我的一個客戶是一所學校。在其檔案伺服器上,所有項目都有一個具有相同命名方案的目錄。
<姓氏>、<名字> <第二名>? - <項目描述>
例如:
Miller, John Andrew - 長項目描述 Willis, Bruce - 描述,可能有逗號 路易斯,瑪麗簡 - 描述 - 包括減號
新的命名約定是:
<名字> <第二名>? <姓氏> - <項目描述>
例如:
John Andrew Miller - 長項目描述 布魯斯威利斯 - 描述,可能帶有逗號 瑪麗簡劉易斯 - 描述 - 包括減號
現在如何將所有現有資料夾批次重命名為新約定?
答案1
由於檔案名稱的描述部分可以包含模式-
(兩個空格之間的連字號),因此您可以將其變更為某個符號不出現在描述部分。我選擇了£
,但這純粹是任意的。
rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *
s/ - /£/' tells rename to replace the first instance of
- it finds with
£ . The second command is a bit more complicated. Parenthases (
() ) are used to group selections together -- so everything that matches the pattern within the first set of parens can be called later as
$1 (all the way up to
$9 ).
[^,] means 'any character, except for
,';
means 'zero or more of the previous character';
[^,]` 表示「零個或多個除逗號之外的任何字元」。由於重命名預設是貪婪的,因此它會匹配盡可能長的字串。
我認為其餘的事情就很自然了。
如果您不確定符號是否出現在檔案名稱中的任何位置,只需執行:
printf '%s\n' *£*
如果你有 perl-rename:
rename 's/([^,]*), (.*) - /$2 $1 - /' *
如果檔案名稱的描述部分包含-
(即-
兩個空格之間的 a),這將中斷。
您應該使用該-n
標誌進行測試,該標誌不會重命名任何文件,但會顯示它的內容會完成了:
rename -n 's/([^,]*), (.*) - /$2 $1 - /' *
答案2
就匹配而言,您需要非常小心才能建立健壯的東西。例如,假設名字和中間名
- 必須以字母開頭
- 可以包含連字符(但不能包含其他標點符號或空格)
你的名字模式變成了類似[[:alpha:]][[:alpha:]-]*
.然後,您可以建立一個可選的以空格分隔的中間名,因為((?: [[:alpha:]][[:alpha:]-]*)?)
額外的非捕獲組結構有助於在中間名為空時保持捕獲組編號的連續性。例如使用基於 perl 的重新命名命令將它們放在一起
rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
或(允許字段之間有更通用的空格而不是單一空格)
rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
該-n
開關是無操作的,即在刪除之前它不會實際執行重命名。如果您沒有基於 perl 的重命名,您可以使用perl
和的組合mv
。