我有一个包含大约42 000个.jpg和视频文件的文件夹,这些文件按年/月分类在不同的子文件夹中。结构如下:
├─2015 │ ├─01 - january │ │ ├─holiday │ │ └─biking │ └─02 - february │ ├─skiing │ └─etc └─2016 └─01 - january
我现在想要添加到所有子文件夹(例如假日),这是包含.jpg文件的lastwritetime的前缀。为了更清楚的解释:
文件假期具有lastwritetime 2015-01-01 然后,“holiday”文件夹将重命名为“2015-01-01 - holiday”。
我已经google /搜索/甚至试图调整我找到的一些代码片段,但没有任何成功。也许有人可以帮助我吗?
编辑:
很抱歉我的评论中有不可读的代码。再一次:
$dir = Get-Childitem 'C:\temp\2011' -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName
$file = Get-Childitem -Path $dir -filter '*.jpg'
Rename-Item -Path $dir.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $dir.Name)
非常感谢提前。
答案 0 :(得分:0)
使用上次写入日期对文件夹进行前缀非常简单。基本上它是这样的:
Get-Item 'C:\some\folder' |
Rename-Item -NewName { '{0:yyyy-MM-dd} {1}' -f $_.LastWriteTime, $_.Name }
Rename-Item
读取要从管道重命名的对象,传递给-NewName
参数的scriptblock根据对象的名称和上次写入时间构造新名称(请参阅{{3}有关格式运算符的更多信息。)
将文件夹重命名为文件的上次写入时间的方法类似:
$dir = Get-Item 'C:\some\folder'
$file = Get-Item 'C:\path\to\your.jpg'
Rename-Item -Path $dir.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $dir.Name)
编辑:您更新的代码会为您提供一个目录列表和一个文件列表。那不适合你想要的东西。您需要获取目录列表,然后获取每个目录的文件列表:
Get-Childitem 'C:\temp\2011' -Recurse | Where-Object {
$_.PSIsContainer
} | ForEach-Object {
$dir = $_
$files_in_dir = Get-ChildItem -Path $dir.FullName -Filter '*.jpg'
}
确定要从该列表重命名文件夹的文件,然后重命名该文件夹:
... | ForEach-Object {
...
$file = $files_in_dir | ...
Rename-Item -Path $dir.FullName -NewName (...)
}
答案 1 :(得分:0)
我认为Ansgar的所有答案都缺少for-each循环,因此您可以重命名所有目录。此外,如果每个目录有多个文件,则需要确定哪个文件'应该使用最后写入时间(我在下面使用最新的)
$dir = get-item 'C:\temp\2011' -Recurse | ?{ $_.PSIsContainer }
$dir | % { $file = Get-ChildItem -Path $_.FullName | Sort LastWriteTime -desc | select -first 1;
Rename-Item -Path $_.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $_.Name) }