sftp - 使用 WinSCP 从 SFTP 服务器下载 X 天后的文件,跳过不包含任何匹配文件的文件夹

标签 sftp winscp

我仅限于 PuTTY 和 WinSCP。

我正在尝试下载包含日志文件的日志目录。例如,我想获取 6 天或更晚的所有 log_fileslog_dir2log_dir3(包括文件夹)符合条件,而 log_dir1 及其文件则不符合条件。

DIR/log_dir1/log_files % older than 6 days
DIR/log_dir2/log_files % meets criteria
DIR/log_dir3/log_files % meets criteria

我的问题是,虽然 log_dir1log_files 未下载,但我当前使用的语法会下载 log_dir1 文件夹。通常情况下,没什么大不了的,但我们正在谈论数百个 log_dir 文件夹(所有文件夹都是空的,因为文件已经超过 6 天)。由于我无法控制的原因,我无法移动或归档这些旧日志目录及其日志文件。

我的问题很简单,如何更改语法以忽略超过 6 天的文件夹以及文件。

get -filemask="*>6D" /DIR/* C:\temp

我尝试了几种不同的参数组合,并且阅读了有关目录掩码和路径掩码的支持页面。我无法让它们中的任何一个工作(版本问题?)。谁能比help page更好地解释他们的语法。明天我将更新我正在使用的 WinSCP 的当前版本。

最佳答案

Time constraint in WinSCP file mask不能用于目录。


但是你可以prevent WinSCP from creating the empty folders 。使用-rawtransfersettings switchExcludeEmptyDirectories setting .

get -rawtransfersettings ExcludeEmptyDirectories=1 -filemask="*>6D" /DIR/* C:\temp

这是在 WinSCP 支持 ExcludeEmptyDirectories 之前的原始答案。作为具有更具体约束的实现的基础,它可能仍然有用。

您可以在PowerShell script with a use of WinSCP .NET assembly中轻松实现此自定义逻辑。 :

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"

# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "example.com"
    UserName = "username"
    Password = "password"
    SshHostKeyFingerprint = "..."
}

$remotePath = "/remote/path"
$localPath = "C:\local\path"
$limit = (Get-Date).AddDays(-6)

$session = New-Object WinSCP.Session

# Connect
$session.Open($sessionOptions)

# Enumerate files to download
$fileInfos =
    $session.EnumerateRemoteFiles(
        $remotePath, $Null, [WinSCP.EnumerationOptions]::AllDirectories) |
    Where-Object { $_.LastWriteTime -gt $limit }

foreach ($fileInfo in $fileInfos)
{
    $localFilePath =
        [WinSCP.RemotePath]::TranslateRemotePathToLocal(
            $fileInfo.FullName, $remotePath, $localPath)

    # If the corresponding local folder does not exist yet, create it
    $localFileDir = Split-Path -Parent $localFilePath
    if (!(Test-Path -Path $localFileDir))
    {
        Write-Host "Creating local directory $localFileDir..."
        New-Item $localFileDir -ItemType directory | Out-Null
    }

    Write-Host "Downloading file $($fileInfo.FullName)..."

    # Download file
    $sourcePath = [WinSCP.RemotePath]::EscapeFileMask($fileInfo.FullName)
    $transferResult = $session.GetFiles($sourcePath, $localFilePath)

    # Did the download succeeded?
    if (!$transferResult.IsSuccess)
    {
        # Print error (but continue with other files)
        Write-Host ("Error downloading file ${remoteFilePath}: " +
            $transferResult.Failures[0].Message)
    }
}

$session.Dispose()

Write-Host "Done."

运行脚本(download.ps1),如下所示:

powershell.exe -ExecutionPolicy Unrestricted -File download.ps1 

关于sftp - 使用 WinSCP 从 SFTP 服务器下载 X 天后的文件,跳过不包含任何匹配文件的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965395/

相关文章:

command-line - 使用 cURL 的 SFTP

dataset - 如何在 ADFv2 中以表达式作为值传递参数?

linux - 我可以在 VULTR 上以 root 身份通过 SSH 连接到 LEMP centos,但我终生无法使用 sftp

ftp - WinSCP:服务器拒绝 SFTP 连接,但它监听 FTP

html - 为什么我的嵌入式样式规则适用于 Github 和 Dreamweaver 而不是我学校的服务器?

PowerShell 和 WinSCP 脚本检查 SFTP 远程目录中是否有超过 4 个文件

c# - 为什么在上传时将文件的本地目录创建到远程

java - 与 apache commons-vfs2 的连接过多

c - 使用 WinSCP/Putty 并在运行 main.c 后得到无意义的输出文件