windows - 将字符串插入多个文件名
问题描述
我有多个以这种格式命名的文件:
Fat1920OVXPlacebo_S20_R1_001.fastq
Kidney1235SHAM_S65_R1_001.fastq
Kidney1911OVXPlacebo_S94_R2_001.fastq
Liver1289OVXEstrogen_S24_R2_001.fastq
我需要在他们的名字中插入字符串“L1000_”,以便他们阅读
Fat1920OVXPlacebo_S20_L1000_R1_001.fastq
Kidney1235SHAM_S65_L1000_R1_001.fastq
Kidney1911OVXPlacebo_S94_L1000_R2_001.fastq
Liver1289OVXEstrogen_S24_L1000_R2_001.fastq
我很抱歉,但我绝对没有在 powershell 中编码的经验。我能找到的最接近的方法是重命名整个文件的脚本:
Set objFso = CreateObject(“Scripting.FileSystemObject”)
Set Folder = objFSO.GetFolder(“ENTER\PATH\HERE”)
For Each File In Folder.Files
sNewFile = File.Name
sNewFile = Replace(sNewFile,”ORIGINAL”,”REPLACEMENT”)
if (sNewFile<>File.Name) then
File.Move(File.ParentFolder+”\”+sNewFile)
end if
Next
但是,我只需要在文件标题的特定位置插入一个字符串。我有 257 个文件,不想一个一个地去。有人知道如何在 Windows 中运行它吗?
解决方案
用于Get-ChildItem
枚举感兴趣的文件,将它们通过管道传输到Rename-Item
,并使用延迟绑定脚本块( { ... }
) 通过基于正则表达式的-replace
操作动态确定新名称。
(Get-ChildItem $yourFolder -Filter *.fastq) |
Rename-Item -NewName { $_.Name -replace '(?<=_S\d+_)', 'L1000_' } -WhatIf
注意:
•上述命令中的-WhatIf
common 参数用于预览操作。-WhatIf
一旦您确定该操作将执行您想要的操作,请删除。
• 即使在这种情况下不是绝对必要的,将Get-ChildItem
命令括在 中(...)
,分组运算符确保已经重命名的文件不会意外地重新进入要重命名的文件的枚举 - 请参阅此答案。
(?<=_S\d+_)
使用肯定的后向断言 ((?<=...)
) 来匹配逐字字符串_S
,后跟一个或多个 (+
) 数字 (\d
),然后是逐字_
。由于后视断言仅匹配字符串中的位置而不是子字符串,因此在这种情况下,替换操作数(
L1000_
在这种情况下逐字逐句)插入到输入字符串(的副本)中的该位置。有关延迟绑定脚本块技术的更详细说明,请参阅此答案。
推荐阅读
- javascript - 在渲染之前使用 HTML 或 JavaScript 调整来自 URL 的图像大小
- javascript - 即使我已导入它,我的函数也无法在另一个函数范围之外工作
- python-3.x - 如何通过对值进行聚类来参考其他列,从给定的数据框中按 1 小时的频率对时间列进行排序?
- reactjs - 提高在 React 中渲染数百个组件的性能
- sqlite - 使用 c++\cli 在内存 sqlite (System.Data.Sqlite) 数据库中使用的正确方法是什么?
- angular - 部署在 IIS 上的 Angular 项目无法从外部进行身份验证
- php - Symfony 和基本的 CSS
- visual-studio-code - 为什么输入“邮政编码:”时 VS Code 会创建超链接?
- django - Django通过多次上传将多个外键保存到数据库
- c# - 使用 mkbundle 时与 RuntimeInformation OS 检查不一致