Mac OS X 批量重命名文件(2 种模式)
Mac OS X Rename files in Batch (2 patterns)
我想匹配 \d\dQ\d
模式或 \dQ\d\d
模式并在文件名前重新格式化。使用 OSX 终端或 ruby,最好的方法是什么?稍微复杂一点,因为是模式1还是模式2。
在第一个文件中,例如模式“3Q17”是一个日期,表示 2017 年第 3 季度。我需要在文件名前添加 2017Q3。但是,我有另一个模式“05Q1”,表示 2005 年第一季度,因此我需要添加 2005Q1。
文件:
ABC-EDFGH-JLG-Sample-3Q17-fIS.pdf
^^^^
2Q13 ABC MF PM Example_fIS.pdf
^^^^
03Q1_FIS.pdf
^^^^
05Q1 ABC_IS.pdf
^^^^
文件重命名:
2017Q3_ABC-EDFGH-JLG-Sample-3Q17-fIS.pdf
2013Q2_2Q13 ABC MF PM Example_fIS.pdf
2003Q1_03Q1_FIS.pdf
2005Q1_05Q1 ABC_IS.pdf
这个问题对单个模式有帮助,但对 2 个模式没有帮助。
mac os x terminal batch rename
我的 ruby 代码工作正常:
Dir.glob("*.pdf").each do |orig_name|
new_name = orig_name.gsub(/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/, '20Q_[=14=]')
File.rename(orig_name, new_name)
end
但是,我在终端中的重命名脚本(使用 brew install rename)提供了错误的结果。
rename -n -e 's/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/'20Q_[=15=]'/' *.pdf
'03Q1_FIS.pdf' would be renamed to '2014Q23_0_FIS.pdf'
'03Q1_vIS.pdf' would be renamed to '2014Q23_0_vIS.pdf'
'05Q1 ABC_IS.pdf' would be renamed to '2014Q23_0 ABC_IS.pdf'
'2Q13 ABC MF PM Example_fIS.pdf' would be renamed to '2014Q23_0 ABC MF PM Example_fIS.pdf'
更新
rename
对正则表达式使用 Perl 语法。在 Perl 之后,它期望反向引用引用捕获的组,否则会显示警告。使用 Perl 正则表达式可以使用 branch reset construct (?|(...)|(...)|...)
and a positive lookbehind:
解决此问题
^.*?(?|(\d\d)Q(\d)|Q(\d\d)(?<=(\d)...))
替换为20Q_$&
正则表达式细分:
^
匹配输入字符串的开头
.*?
匹配所有事物(不贪婪地)直到...
(?|
分支重置构造的开始
(\d\d)
抓取组1中的两个数字
Q
匹配一个Q
(\d)
抓取组 2 中的一个数字
|
或
Q
匹配一个Q
(\d\d)
抓取组1中的两个数字
(?<=(\d)...)
捕获组 2 中 Q
之前的数字
)
构造结束
这样两个捕获组同时存在,第一个捕获组总是指 2 位数字,第二个捕获组总是指 1 位数字,我们不需要处理 4 个不同的捕获组。
您可以尝试匹配以 pattern 开头且开头有更多数字的两个模式,然后使用一个替换字符串,其中按顺序包含对所有捕获组的反向引用。这是正则表达式:
^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))
和替换字符串:
20Q_[=12=]
Ruby (Live demo)
str.gsub(/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/, '20Q_[=13=]')
我想匹配 \d\dQ\d
模式或 \dQ\d\d
模式并在文件名前重新格式化。使用 OSX 终端或 ruby,最好的方法是什么?稍微复杂一点,因为是模式1还是模式2。
在第一个文件中,例如模式“3Q17”是一个日期,表示 2017 年第 3 季度。我需要在文件名前添加 2017Q3。但是,我有另一个模式“05Q1”,表示 2005 年第一季度,因此我需要添加 2005Q1。
文件:
ABC-EDFGH-JLG-Sample-3Q17-fIS.pdf
^^^^
2Q13 ABC MF PM Example_fIS.pdf
^^^^
03Q1_FIS.pdf
^^^^
05Q1 ABC_IS.pdf
^^^^
文件重命名:
2017Q3_ABC-EDFGH-JLG-Sample-3Q17-fIS.pdf
2013Q2_2Q13 ABC MF PM Example_fIS.pdf
2003Q1_03Q1_FIS.pdf
2005Q1_05Q1 ABC_IS.pdf
这个问题对单个模式有帮助,但对 2 个模式没有帮助。
mac os x terminal batch rename
我的 ruby 代码工作正常:
Dir.glob("*.pdf").each do |orig_name|
new_name = orig_name.gsub(/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/, '20Q_[=14=]')
File.rename(orig_name, new_name)
end
但是,我在终端中的重命名脚本(使用 brew install rename)提供了错误的结果。
rename -n -e 's/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/'20Q_[=15=]'/' *.pdf
'03Q1_FIS.pdf' would be renamed to '2014Q23_0_FIS.pdf'
'03Q1_vIS.pdf' would be renamed to '2014Q23_0_vIS.pdf'
'05Q1 ABC_IS.pdf' would be renamed to '2014Q23_0 ABC_IS.pdf'
'2Q13 ABC MF PM Example_fIS.pdf' would be renamed to '2014Q23_0 ABC MF PM Example_fIS.pdf'
更新
rename
对正则表达式使用 Perl 语法。在 Perl 之后,它期望反向引用引用捕获的组,否则会显示警告。使用 Perl 正则表达式可以使用 branch reset construct (?|(...)|(...)|...)
and a positive lookbehind:
^.*?(?|(\d\d)Q(\d)|Q(\d\d)(?<=(\d)...))
替换为20Q_$&
正则表达式细分:
^
匹配输入字符串的开头.*?
匹配所有事物(不贪婪地)直到...(?|
分支重置构造的开始(\d\d)
抓取组1中的两个数字Q
匹配一个Q
(\d)
抓取组 2 中的一个数字|
或Q
匹配一个Q
(\d\d)
抓取组1中的两个数字(?<=(\d)...)
捕获组 2 中
Q
之前的数字)
构造结束
这样两个捕获组同时存在,第一个捕获组总是指 2 位数字,第二个捕获组总是指 1 位数字,我们不需要处理 4 个不同的捕获组。
您可以尝试匹配以 pattern 开头且开头有更多数字的两个模式,然后使用一个替换字符串,其中按顺序包含对所有捕获组的反向引用。这是正则表达式:
^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))
和替换字符串:
20Q_[=12=]
Ruby (Live demo)
str.gsub(/^.*?(?:(\d\d)Q(\d)|(\d)Q(\d\d))/, '20Q_[=13=]')