我有一个包含几个文件的文件夹,如下所示:
XXX_01_07_11_1.bat
XX_1_07_06_02.bat
XXXX_2_22_14_01_02.bat
没有特定的长度。
我想重命名文件夹中的所有文件,删除所有前导零。 例如,XXX_01_07_11_1.bat将重命名为XXX_1_7_11_1.bat。
我在Bash中找到了一些方法,但没有使用powershell。
答案 0 :(得分:1)
试试这个:
get-childitem "c:\temp" -file -filter "*.bat" | %{
$NewName=($_.Name -split '_' | %{if ($_ -eq '0') {'0'} else {$_.TrimStart('0')}}) -join '_'
Rename-Item $_.FullName $NewName
}
答案 1 :(得分:1)
最简单的方法是将ggplot(iris, aes(x=Sepal.Length, y=Species, fill=..x..)) +
geom_density_ridges_gradient()
替换为_0
,如下所示:
_
请试一试。 :)
答案 2 :(得分:1)
cd c:\temp
'X_01_00007_11_1.bat','X_1_07_06_02.bat','X_2_22_14_01_02.bat','X_000_0_07_06_02.bat'|% {
New-Item $_ -Force}
Get-ChildItem -Path C:\Temp -File |ForEach-Object {
$oldname=$_.Name
$newname = $oldname -replace '_0+(?=\d)', '_'
#or
#$newname = $oldname -replace '_0+(\d)', '_$1'
Rename-Item $oldname -NewName $newname
}
目录:C:\ temp
模式LastWriteTime长度名称
---- ------------- ------ ----
-a ---- 2018/5/7 20:55 0 X_01_00007_11_1.bat
-a ---- 2018/5/7 20:55 0 X_1_07_06_02.bat
-a ---- 2018/5/7 20:55 0 X_2_22_14_01_02.bat
-a ---- 2018/5/7 20:55 0 X_000_0_07_06_02.bat
PS C:\ temp> DIR
目录:C:\ temp
模式LastWriteTime长度名称
---- ------------- ------ ----
-a ---- 2018/5/7 20:55 0 X_0_0_7_6_2.bat
-a ---- 2018/5/7 20:55 0 X_1_7_11_1.bat
-a ---- 2018/5/7 20:55 0 X_1_7_6_2.bat
-a ---- 2018/5/7 20:55 0 X_2_22_14_1_2.bat
答案 3 :(得分:1)
注意:这与accepted answer类似,但表明您可以将Get-ChildItem
输出直接传递给Rename-Item
,这是Get-ChildItem . -Filter *.bat |
Rename-Item -NewName { $_.Name -replace '(?<=_)0+' } -WhatIf
更简洁,更有效率。
.
指定所需的目标文件夹而不是-WhatIf
{ ... }
预览重命名;将其删除以实际重命名。
您可以将脚本块(Rename-Item -NewName
)传递给$_
,对每个输入对象(文件)进行评估,其中{{1}指的是手边的文件。
-NewName
是[string]
类型参数,此方法仍然有效。相反,传递脚本块的能力 - 脚本块参数是一个强大的通用PowerShell功能,允许您计算 每个输入的参数值-object 基于脚本块 - 有关详细信息,请参阅here。 -replace
执行基于正则表达式的字符串替换,'(?<=_)0+'
替换一个或多个(+
)0
字符的任何序列,如果前面带有({ {1}})?<=
字符。
_
是(正) lookbehind断言的实例,这意味着虽然(?<=_)
匹配,但它不会被捕获;也就是说,它不会成为替换的一部分。答案 4 :(得分:1)
应用_0+(?=[1-9])
或_0+(?=\d)
正则表达式,如下所示:
Get-ChildItem . -File -Filter "*_0*.*" |
ForEach-Object {
Rename-Item $_.FullName $($_.Name -replace '_0+(?=\d)', '_') -WhatIf
}
调试后立即删除风险缓解参数-WhatIf
(或使用-WhatIf:$false
来抑制$WhatIfPreference
值产生的自动 WhatIf 行为变量是1
,另见Get-Help about_Preference_Variables
)。
正则表达式解释:
_
匹配字符_
低线(下划线)字面上0+
字面匹配字符0
+
量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)?=
积极前瞻。断言上面跟_0+
匹配
[1-9]
[1-9]
列表中的单个字符,即1(unicode 49)和9(unicode 57)之间的范围,或\d
一个数字(等于[0-9]
列表但[1-9]
有效地归因于上面的贪婪'0 +'。