regex - 使用 powershell 使用正则表达式重命名多个目录名称
问题描述
我在某个时候卡住了。假设以下目录:
d:\example
0 test1_123.txt
<DIR> test1_123_abc0
0 test2.txt
<DIR> test2_123
<DIR> test3_123_abc1
<DIR> test4_test0_abc0
我现在想使用所有目录名称的正则表达式 '_abc*' 删除后缀。我尝试了以下方法:
Get-ChildItem d:\example\ -Directory | foreach { rename-item $_ $_ -replace '_abc.' }
有人知道这里出了什么问题并可以分享解决方案吗?
解决方案
这是解决问题的一种方法……[笑]
它能做什么 ...
- 创建一些文件和目录以
在准备好实际执行此操作时进行测试,只需删除整个#region/#endregion
块。 - 设置目标目录、目录过滤器和正则表达式删除模式
如果您还想删除_abc
末尾没有任何数字,请将+
[一个或多个] 替换为*
[零或多个]。 - 获取匹配目录的列表
- 遍历该列表
- 通过剥离与正则表达式匹配的结尾来重命名目录
请注意,这不处理名称冲突。如果您两次运行此代码,您将test5_abc666
在重命名为test5
... 并且已经存在具有该名称的目录时看到这种情况。[咧嘴笑]
编码 ...
#region >>> make some test files & dirs
@(
'test1_123.txt'
'test2.txt'
'test3_abc9.log'
) | ForEach-Object {
$Null = New-Item -Path $env:TEMP -Name $_ -ItemType File -ErrorAction SilentlyContinue
}
@(
'test1_123_abc0'
'test2_123'
'test3_123_abc1'
'test4_test0_abc0'
'test5_abc666'
) | ForEach-Object {
$Null = New-Item -Path $env:TEMP -Name $_ -ItemType Directory -ErrorAction SilentlyContinue
}
#endregion >>> make some test files & dirs
$TargetDir = $env:TEMP
$Filter = '*_abc*'
$Regex_ThingToRemove = '_abc\d+$'
$DirList = Get-ChildItem -LiteralPath $TargetDir -Directory -Filter $Filter
foreach ($DL_Item in $DirList)
{
Rename-Item -LiteralPath $DL_Item.FullName -NewName ($DL_Item.Name -replace $Regex_ThingToRemove)
}
推荐阅读
- javascript - 如何使用 Firebase RealTime 数据库根据特定类别获取项目集合
- momentjs - 将矩范围与帆后端连接起来
- batch-file - 通过批处理脚本更改 PC 的主机名
- azure - Azure Devops 代码覆盖率被错误地识别为工件
- django - 如何区分多个 GenericForeignKey 与一个模型的关系?
- java - 如何在 Java 中训练 keras(张量流)模型?
- c++ - 通过 bash 脚本进行 Vscode C++ 调试
- linux - 如何防止gtk重绘整个GtkDrawingArea?
- ssl - 解决 boost.asio certificate failed 错误-without- access to source code,找出Philips Hue Bridge共享哪些信息
- apache-spark - 带有窗口函数的 PySpark 数据偏度