从LastWriteTime添加内容文件的文件夹前缀

时间:2016-05-04 13:15:17

标签: file powershell directory rename

我有一个包含大约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) 

非常感谢提前。

2 个答案:

答案 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) }