使用 csv 文件中的新名称重命名目录中的文件



我正在寻求帮助,以创建一个脚本,该脚本可以将目录中包含的所有文件重命名为csv文件中引用的表。例如,我有一个带有随机文件名的文件夹,我还有一个 csv 文件,其中 A 列中的当前文件名,以及 B 列中应更改的实际文件名。

我想过使用类似以下内容的东西:

get-childitem *pdf -force | foreach { rename-item $_ $_.Name.Replace((Import-Csv -path .List.csv).filename, (Import-Csv -Path .List.csv).newfilename) }

请注意,文件名新文件名分别引用A列和B列。

运行此脚本时,实际上没有任何反应。我是Powershell的新手,所以我已经达到了如何完成这项任务的知识的极限。任何和所有的帮助将不胜感激!

谢谢大家!

如果您位于包含目标文件和 CSV 文件的目录中,则可以执行以下操作。这假设您的 CSV 中有名为filenamenewfilename的标头。

$TargetDir = Resolve-Path -Path .
Import-Csv -Path .List.csv | Foreach-Object {
$Src = Join-Path -Path $TargetDir -ChildPath $_.filename
$Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
Rename-Item -Path $Src -NewName $Dst
}

如果目标目录是另一个位置,则只需修改Join-Path语句即可使用-Path

$TargetDir = 'c:folder'
Import-Csv -Path .List.csv | Foreach-Object {
$Src = Join-Path -Path $TargetDir -ChildPath $_.filename
$Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
Rename-Item -Path $Src -NewName $Dst
}

注意:如果CSV文件不包含标题,则需要使用Import-Csv中的-Header开关,例如Glenn的有用答案,或者将列标题添加到CSV。

假设.csv中没有标头并且它只包含文件名,这可能适合您:

# Only import the CSV once
$csvData = Import-Csv .List.csv -Header "Old","New"
# Remove the -WhatIf after testing
Get-ChildItem | ForEach-Object { 
$file = $_
$csvData | Where-Object { 
$_.Old -eq $file.Name 
} | ForEach-Object { 
Rename-Item -Path $file -NewName $_.New -WhatIf 
} 
}

或者更简洁的实现:

$csvData = Import-Csv .List.csv -Header "Old","New"
dir | %{ $file = $_; $csvData | ?{ $_.Old -eq $file.Name } | %{ Rename-Item -Path $file -NewName $_.New -WhatIf } }

====

=================================在 MacOS 上测试:

只需创建一个名为 map 的文件.csv并像这样格式化它:

old_file1.txt,new_file1.txt
old_file2.txt,new_file2.txt
old_file3.txt,new_file3.txt

创建一个 shell 脚本rename.sh并更改变量folder_path、csv_file 和 file_extension:

#!/bin/bash
folder_path="path/to/your/files/"
csv_file="path/to/map/file/map.csv"
file_extension=".jpg"
while IFS=',' read -r old_file new_file
do
mv "${folder_path}/${old_file}${file_extension}" "${folder_path}/${new_file}${file_extension}"
echo "File ${old_file}${file_extension} renamed to ${new_file}${file_extension}."
done < "$csv_file"

使用sh rename.sh启动脚本

并享受魔力;-(

最新更新