【问题标题】:PS - Find Folders that Haven't Had their Files Modfied in Some TimePS - 查找一段时间内未修改文件的文件夹
【发布时间】:2022-01-03 20:26:08
【问题描述】:

我们正在迁移我们的 FTP,我只想迁移其中包含在过去 6 个月内使用/写入的文件的文件夹。我认为这将是我在 google 上到处都能找到的东西,但我发现的所有脚本都有相同的致命缺陷。

我发现的所有内容似乎都取决于文件夹的“修改日期”。问题是,我有很多文件夹显示几年前的“修改日期”,但是当你深入研究它时,有一些文件直到今天才被创建和写入。

示例: D:/Weblogs 可能显示修改日期为 2018 年 1 月 1 日,但是,当您深入研究它时,有一个名为“Log6”的文件夹 idk,比方说,该文件夹中有一个日志文件被修改为最近和昨天。

我看到的所有这些脚本都会拉取顶部文件夹的修改日期,这似乎并不准确。

有没有办法解决这个问题?我会期待类似的东西 获取某个顶层的所有文件夹,然后通过这些文件夹的 CONTENTS 查找具有 datemodified -lt adddays(-180) 过滤器的文件。如果找到“新”的内容,则不要将总体目录添加到数组中,但如果没有,则列出该目录。

有什么想法吗?

编辑:我试过了

$path = <some dir>
gci -path $path -Directory where-object {LastWriteTime -lt (get-date).addmonths(-6))} 

$filter = {$_.LastWriteTime -lt (Get-Date).AddDays(-180)}
#$OldStuff = gci "D:\FTP\BELAMIINC" -file | Where-Object $filter
$OldFolders = gci "D:\FTP\BELAMIINC" -Directory | ForEach-Object {
    gci "D:\FTP\BELAMIINC" -file | Where-Object $filter
}

Write-Host $OldFolders

【问题讨论】:

  • 目录的修改日期并不是其中文件修改日期的可靠指南。您确实需要比较文件时间,而不是目录时间。
  • 用我尝试过的方法编辑了我的帖子。

标签: windows bash powershell file


【解决方案1】:

试一试,我添加了 cmets 供您参考。

-Force的使用主要是查找隐藏文件和文件夹。

$path = '/path/to/parentFolder'
$limit = [datetime]::Now.AddMonths(-6)

# Get all the child folders recursive
$folders = Get-ChildItem $path -Recurse -Directory -Force

# Loop over the folders to see if there is at least one file
# that has been modified or accessed after the limit date
$result = foreach($folder in $folders)
{
    :inner foreach($file in Get-ChildItem $folder -File -Force)
    {
        if($file.LastAccessTime -gt $limit -or $file.LastWriteTime -gt $limit)
        {
            # If this condition is true at least once, break this loop and return
            # the folder's FullName, the File and File's Date for reference
            [pscustomobject]@{
                FullName       = $folder.FullName
                File           = $file.Name
                LastAccessTime = $file.LastAccessTime
                LastWriteTime  = $file.LastWriteTime
            }
            break inner
        }
    }
}

$result | Out-GridView

如果您需要查找最近没有修改文件的文件夹,您可以使用$folders 数组并将其与$result 进行比较:

$folders.where({$_.FullName -notin $result.FullName}).FullName

【讨论】:

  • 看起来 :inner 行由于某种原因附加了我的用户环境。我得到 GET-CHILDITEM 的 TONS(可能每个循环一个)找不到路径 C:\users\MYUSER\firstfilethelooptrips
  • 继续并更改此行 $folders = Get-ChildItem $path -Recurse -Directory -Force 到此 $folders = (Get-ChildItem $path -Recurse -Directory -Force).FullName 那没有不行。所以报废了。然后我继续将这个 :inner foreach($file in Get-ChildItem $folder -File -Force) 更改为这个 :inner foreach($file in Get-ChildItem $folder.FullName -File -Force) 我得到了一个输出!但是,我希望输出一段时间内访问过的那些。然而,这个列表应该告诉我要移动哪些东西,我可以从这里做一些布尔运算。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多