如何从一天中的特定时间(时段)整理出图像?
How to sort out images from a specific time(period) of day?
TIMELAPSE 项目
一年多来,我的网络摄像头每 15 分钟上传一张新照片(数千张照片)
我正在寻找一种简单的方法来
1. 每天挑选一张照片,拍摄时间尽可能接近 12:00 中午
2.然后将所有选中的文件移动到一个子文件夹
文件名格式为 YYYYMMDDHHMMSS(例如 20180715035717.jpg)
修改日期也可以在文件详细信息中找到。
PS:修改日期/LastWriteTime 是从照片拍摄时算起的 -2 小时
如有任何帮助,我们将不胜感激
Screenshot of folder with files
示例:对于在 11:50 和 12:10 之间拍摄的每张照片,移至子文件夹
LastWriteTime////Length//// Name
15.07.2018 08.37 2655543 20180715103707.jpg
15.07.2018 08.52 3294951 20180715105207.jpg
15.07.2018 09.07 2787347 20180715110707.jpg
15.07.2018 09.27 2632705 20180715112706.jpg
15.07.2018 09.42 2589219 20180715114206.jpg
15.07.2018 10.02 2767032 20180715120208.jpg - MOVE TO SUBFOLDER
15.07.2018 10.27 2997687 20180715122726.jpg
15.07.2018 10.52 3071746 20180715125224.jpg
15.07.2018 11.13 2981523 20180715131308.jpg
15.07.2018 11.37 3074120 20180715133708.jpg
15.07.2018 11.57 2753426 20180715135708.jpg
15.07.2018 12.17 2575961 20180715141709.jpg
15.07.2018 12.37 2664982 20180715143710.jpg
15.07.2018 12.52 3049712 20180715145210.jpg
15.07.2018 13.16 2637337 20180715151618.jpg
15.07.2018 13.31 2755671 20180715153118.jpg
15.07.2018 13.46 2937633 20180715154618.jpg
15.07.2018 14.07 2591824 20180715160724.jpg
15.07.2018 14.22 2616955 20180715162225.jpg
15.07.2018 14.37 2632948 20180715163725.jpg
15.07.2018 14.52 2760379 20180715165225.jpg
15.07.2018 15.07 3080011 20180715170725.jpg
15.07.2018 15.27 3339818 20180715172706.jpg
15.07.2018 15.42 3136413 20180715174206.jpg
15.07.2018 15.58 3015146 20180715175806.jpg
15.07.2018 16.21 2597969 20180715182111.jpg
15.07.2018 16.41 2627375 20180715184112.jpg
15.07.2018 16.56 2685684 20180715185613.jpg
15.07.2018 17.13 2590604 20180715191313.jpg
15.07.2018 17.37 2621325 20180715193718.jpg
/// REMOVED SOME LINES
16.07.2018 06.08 1956348 20180716080822.jpg
16.07.2018 06.27 2119143 20180716082705.jpg
16.07.2018 06.47 2176428 20180716084706.jpg
16.07.2018 07.02 3243543 20180716090207.jpg
16.07.2018 07.26 2013755 20180716092649.jpg
16.07.2018 07.46 2017713 20180716094649.jpg
16.07.2018 08.01 3565675 20180716100150.jpg
16.07.2018 08.16 3578500 20180716101651.jpg
16.07.2018 08.37 3807611 20180716103705.jpg
16.07.2018 08.57 3728615 20180716105729.jpg
16.07.2018 09.12 3712588 20180716111230.jpg
16.07.2018 09.27 3747855 20180716112730.jpg
16.07.2018 09.42 3744401 20180716114230.jpg
16.07.2018 09.57 3593773 20180716115730.jpg - MOVE TO SUBFOLDER
16.07.2018 10.17 3189216 20180716121732.jpg
16.07.2018 10.33 3400749 20180716123307.jpg
16.07.2018 10.48 3501471 20180716124807.jpg
假设 "Date Modified" 列有效,因此您可以使用它而不必从文件名中提取日期,PowerShell 处理 System.DateTime
对象,让您获得 .Date
out - 即没有时间的日子。
步骤可以是:
- 按日期对图片进行分组,所以每天都有一组
- 每个组的中午时间使用此日期+12 小时
- 中午日期减去文件日期,取绝对值去掉+/-号
- 排序以获得距中午的最小距离
未经测试,但我认为大致正确,PowerShell 示例:
Get-ChildItem -Path 'c:\pictures' |
# group the pictures by day
Group-Object -Property {$_.LastWriteTime.Date} |
# loop over each day-group
ForEach-Object {
# get the day back from the group name, make it midday
$midday = (Get-Date $_.Name).AddHours(12)
# sort the files for that day,
# by closeness to midday,
# pick the nearest 1
# Copy it to ... ? you didn't say where. Some subfolder, I guess
$_.Group | Sort-Object {
[math]::abs(($_.LastWriteTime - $midday).TotalSeconds)} |
Select-Object -First 1
} |
Copy-Item -Destination 'c:\pictures\subfolder' -WhatIf
}
您必须删除 -WhatIf
才能使其真正执行操作,并将 copy-item
更改为 move-item
才能使其对您的数据进行加扰。
我怀疑类似这样的东西应该可以解决问题:
Get-ChildItem -Path C:\SomePath\ToPictures\ -Filter *.jpg -Recurse |
Where-Object -FilterScript {!$_.PSIsContainer -and $_.LastWriteTime.TimeOfDay.TotalHours -gt 11.875 -and $_.LastWriteTime.TimeOfDay.TotalHours -lt 12.125} |
Move-Item -Destination C:\TargetPath\
获取C:\SomePath\ToPictures中的所有*.jpg文件。确保它们不是文件夹,并且是在 11:52:30 AM 之后但在 12:07:30 PM 之前写入的(间隔 15 分钟)。然后,将它们移动到 C:\TargetPath.
注意:您可能希望先使用 Copy-Item 进行测试,然后再使用 Move-Item。
希望对您有所帮助。
如果你想在文件名中使用时间戳,下面的代码应该做你想做的:
$sourceFolder = 'D:\test'
$destination = 'D:\PicturesAroundNoon'
# if the destination path does not exist, ceate it
if (!(Test-Path -Path $destination -PathType Container)) {
$null = New-Item -Path $destination -ItemType Directory
}
# get a list of FileInfo objects for the files to move
Get-ChildItem -Path $sourceFolder -Filter '*.jpg' -File |
Where-Object { $_.BaseName -match '^\d{14}$' -and $_.Name.Substring(8,2) -match '11|12' } |
Group-Object @{Expression = {$_.BaseName.Substring(0,8)}} |
ForEach-Object {
if ($_.Group.Count -eq 1) { $fileToMove = $_.Group[0] } # return the only file for thatdate
else {
if ($_.Group.Count -eq 2) {
$index = 0
}
else {
$index = [math]::Floor($_.Group.Count / 2)
}
# get the middle two files from the collection and test which is closest to 12:00
$file1, $file2 = ($_.Group | Sort-Object)[$index..($index + 1)]
# get the dates from the file BaseName property
$date1 = [datetime]::ParseExact($file1.BaseName, 'yyyyMMddHHmmss', $null)
$date2 = [datetime]::ParseExact($file2.BaseName, 'yyyyMMddHHmmss', $null)
$noon = Get-Date -Year $date1.Year -Month $date1.Month -Day $date1.Day -Hour 12 -Minute 0 -Second 0
# get the time distance to 12:00 in seconds
$dif1 = [math]::Abs(($date1 - $noon).TotalSeconds)
$dif2 = [math]::Abs(($date2 - $noon).TotalSeconds)
$fileToMove = if ($dif1 -lt $dif2) { $file1 } else { $file2 }
}
# now move the file to its destination
$fileToMove | Move-Item -Destination $destination -WhatIf
}
如果您对控制台中显示的结果感到满意,请删除 -WhatIf
TIMELAPSE 项目
一年多来,我的网络摄像头每 15 分钟上传一张新照片(数千张照片)
我正在寻找一种简单的方法来
1. 每天挑选一张照片,拍摄时间尽可能接近 12:00 中午
2.然后将所有选中的文件移动到一个子文件夹
文件名格式为 YYYYMMDDHHMMSS(例如 20180715035717.jpg)
修改日期也可以在文件详细信息中找到。
PS:修改日期/LastWriteTime 是从照片拍摄时算起的 -2 小时
如有任何帮助,我们将不胜感激
Screenshot of folder with files
示例:对于在 11:50 和 12:10 之间拍摄的每张照片,移至子文件夹
LastWriteTime////Length//// Name
15.07.2018 08.37 2655543 20180715103707.jpg
15.07.2018 08.52 3294951 20180715105207.jpg
15.07.2018 09.07 2787347 20180715110707.jpg
15.07.2018 09.27 2632705 20180715112706.jpg
15.07.2018 09.42 2589219 20180715114206.jpg
15.07.2018 10.02 2767032 20180715120208.jpg - MOVE TO SUBFOLDER
15.07.2018 10.27 2997687 20180715122726.jpg
15.07.2018 10.52 3071746 20180715125224.jpg
15.07.2018 11.13 2981523 20180715131308.jpg
15.07.2018 11.37 3074120 20180715133708.jpg
15.07.2018 11.57 2753426 20180715135708.jpg
15.07.2018 12.17 2575961 20180715141709.jpg
15.07.2018 12.37 2664982 20180715143710.jpg
15.07.2018 12.52 3049712 20180715145210.jpg
15.07.2018 13.16 2637337 20180715151618.jpg
15.07.2018 13.31 2755671 20180715153118.jpg
15.07.2018 13.46 2937633 20180715154618.jpg
15.07.2018 14.07 2591824 20180715160724.jpg
15.07.2018 14.22 2616955 20180715162225.jpg
15.07.2018 14.37 2632948 20180715163725.jpg
15.07.2018 14.52 2760379 20180715165225.jpg
15.07.2018 15.07 3080011 20180715170725.jpg
15.07.2018 15.27 3339818 20180715172706.jpg
15.07.2018 15.42 3136413 20180715174206.jpg
15.07.2018 15.58 3015146 20180715175806.jpg
15.07.2018 16.21 2597969 20180715182111.jpg
15.07.2018 16.41 2627375 20180715184112.jpg
15.07.2018 16.56 2685684 20180715185613.jpg
15.07.2018 17.13 2590604 20180715191313.jpg
15.07.2018 17.37 2621325 20180715193718.jpg
/// REMOVED SOME LINES
16.07.2018 06.08 1956348 20180716080822.jpg
16.07.2018 06.27 2119143 20180716082705.jpg
16.07.2018 06.47 2176428 20180716084706.jpg
16.07.2018 07.02 3243543 20180716090207.jpg
16.07.2018 07.26 2013755 20180716092649.jpg
16.07.2018 07.46 2017713 20180716094649.jpg
16.07.2018 08.01 3565675 20180716100150.jpg
16.07.2018 08.16 3578500 20180716101651.jpg
16.07.2018 08.37 3807611 20180716103705.jpg
16.07.2018 08.57 3728615 20180716105729.jpg
16.07.2018 09.12 3712588 20180716111230.jpg
16.07.2018 09.27 3747855 20180716112730.jpg
16.07.2018 09.42 3744401 20180716114230.jpg
16.07.2018 09.57 3593773 20180716115730.jpg - MOVE TO SUBFOLDER
16.07.2018 10.17 3189216 20180716121732.jpg
16.07.2018 10.33 3400749 20180716123307.jpg
16.07.2018 10.48 3501471 20180716124807.jpg
假设 "Date Modified" 列有效,因此您可以使用它而不必从文件名中提取日期,PowerShell 处理 System.DateTime
对象,让您获得 .Date
out - 即没有时间的日子。
步骤可以是:
- 按日期对图片进行分组,所以每天都有一组
- 每个组的中午时间使用此日期+12 小时
- 中午日期减去文件日期,取绝对值去掉+/-号
- 排序以获得距中午的最小距离
未经测试,但我认为大致正确,PowerShell 示例:
Get-ChildItem -Path 'c:\pictures' |
# group the pictures by day
Group-Object -Property {$_.LastWriteTime.Date} |
# loop over each day-group
ForEach-Object {
# get the day back from the group name, make it midday
$midday = (Get-Date $_.Name).AddHours(12)
# sort the files for that day,
# by closeness to midday,
# pick the nearest 1
# Copy it to ... ? you didn't say where. Some subfolder, I guess
$_.Group | Sort-Object {
[math]::abs(($_.LastWriteTime - $midday).TotalSeconds)} |
Select-Object -First 1
} |
Copy-Item -Destination 'c:\pictures\subfolder' -WhatIf
}
您必须删除 -WhatIf
才能使其真正执行操作,并将 copy-item
更改为 move-item
才能使其对您的数据进行加扰。
我怀疑类似这样的东西应该可以解决问题:
Get-ChildItem -Path C:\SomePath\ToPictures\ -Filter *.jpg -Recurse |
Where-Object -FilterScript {!$_.PSIsContainer -and $_.LastWriteTime.TimeOfDay.TotalHours -gt 11.875 -and $_.LastWriteTime.TimeOfDay.TotalHours -lt 12.125} |
Move-Item -Destination C:\TargetPath\
获取C:\SomePath\ToPictures中的所有*.jpg文件。确保它们不是文件夹,并且是在 11:52:30 AM 之后但在 12:07:30 PM 之前写入的(间隔 15 分钟)。然后,将它们移动到 C:\TargetPath.
注意:您可能希望先使用 Copy-Item 进行测试,然后再使用 Move-Item。
希望对您有所帮助。
如果你想在文件名中使用时间戳,下面的代码应该做你想做的:
$sourceFolder = 'D:\test'
$destination = 'D:\PicturesAroundNoon'
# if the destination path does not exist, ceate it
if (!(Test-Path -Path $destination -PathType Container)) {
$null = New-Item -Path $destination -ItemType Directory
}
# get a list of FileInfo objects for the files to move
Get-ChildItem -Path $sourceFolder -Filter '*.jpg' -File |
Where-Object { $_.BaseName -match '^\d{14}$' -and $_.Name.Substring(8,2) -match '11|12' } |
Group-Object @{Expression = {$_.BaseName.Substring(0,8)}} |
ForEach-Object {
if ($_.Group.Count -eq 1) { $fileToMove = $_.Group[0] } # return the only file for thatdate
else {
if ($_.Group.Count -eq 2) {
$index = 0
}
else {
$index = [math]::Floor($_.Group.Count / 2)
}
# get the middle two files from the collection and test which is closest to 12:00
$file1, $file2 = ($_.Group | Sort-Object)[$index..($index + 1)]
# get the dates from the file BaseName property
$date1 = [datetime]::ParseExact($file1.BaseName, 'yyyyMMddHHmmss', $null)
$date2 = [datetime]::ParseExact($file2.BaseName, 'yyyyMMddHHmmss', $null)
$noon = Get-Date -Year $date1.Year -Month $date1.Month -Day $date1.Day -Hour 12 -Minute 0 -Second 0
# get the time distance to 12:00 in seconds
$dif1 = [math]::Abs(($date1 - $noon).TotalSeconds)
$dif2 = [math]::Abs(($date2 - $noon).TotalSeconds)
$fileToMove = if ($dif1 -lt $dif2) { $file1 } else { $file2 }
}
# now move the file to its destination
$fileToMove | Move-Item -Destination $destination -WhatIf
}
如果您对控制台中显示的结果感到满意,请删除 -WhatIf