我需要重命名很多目录及其子目录。
我有一个 csv 文件,其中包含旧目录名称和所需的新名称。
1,blah,old_name1,new_name2,wibble
2,foo,old_name2,new_name2,bar
3,john,old_name3,new_name3,paul
4,george,old_name4,new_name4,ringo
注意有些目录名是
old_name1-morestuffhere
需要重命名为
new_name1-morestuffhere
我大致知道如何在 bash 中执行此操作:
mv -r `cat file.csv | awk -F, '{print $3* $4*}'`
..但我已经完全迷失了 powershell。
编辑:这是我到目前为止所得到的。这很近吗?:
cat .\file.csv | foreach { $oldname = $_.split(",")[2], $newname = $_.split(",")[3], move-item $oldname*, $newname*}
最佳答案
“-morestuffhere”是棘手的部分。 Move-Item 和 Rename-Item 上的路径参数(即源位置)不采用通配符。但这可以通过另一种方式解决。首先,您能否像这样将 CSV header 添加到您的 CSV 文件中:
Index,F2,OldName,NewName,F5
1,blah,old_name1,new_name2,wibble
...
如果是这样,我们可以使用 PowerShell 的 Import-Csv cmdlet。现在下面看起来有点复杂,但它处理了多个 OldName-<differentstuffhere>
的情况。至 NewName-<sameasoldnamestuffhere>
重命名。
$names = Import-Csv names.csv |
Foreach {
$oldDirs=@(Get-ChildItem . -r -filter "$($_.OldName)*" |
?{$_.PSIsContainer} | %{$_.FullName})
Add-Member -in $_ NoteProperty OldDirs $oldDirs -PassThru
}
foreach ($name in $names) {
foreach ($oldDir in $name.oldDirs) {
$dir = Split-Path $oldDir -Parent
$suffix = (Split-Path $oldDir -Leaf).Substring($name.OldName.Length)
$newPath = Join-Path $dir ($name.NewName + $suffix)
Rename-Item $oldDir ($name.NewName + $suffix) -WhatIf -ea 0
}
}
这是手工解释的,因此可能存在错误。当您对结果满意时,删除 -Whatif。
关于windows - 使用 Powershell 使用查找文件递归重命名目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1686443/