【问题标题】:Deleting remote .csv files with timestamp in their names older than 2 days删除名称中时间戳超过 2 天的远程 .csv 文件
【发布时间】:2017-09-30 12:07:46
【问题描述】:

我正在尝试删除 FTP 服务器中超过 2 天的远程 (.csv) 文件。

文件的最后修改时间设置不正确。我必须依靠他们名字中的时间戳。

文件的命名类似于Sales_201705010315.csv(日期和时间)。

我当前的 WinSCP 脚本是:

option batch on
option confirm off
open login ftp credentials
cd /OUT
rm *<1D
exit

当我运行脚本时,文件不会被删除。有人可以纠正我的脚本

【问题讨论】:

  • 你是如何运行 .txt 文件的?它看起来像 WinSCP 脚本,但你没有提到 WinSCP + 什么问题?剧本看起来不错。如果它不能如您所愿,您必须告诉我们,出了什么问题! + 虽然你为什么要使用*&lt;1D,如果你想选择 2 天前的文件? + 你真的可以通过修改时间来选择文件吗?因为您的帖子表明文件的名称中有时间戳。这与*&lt;1D 使用的文件修改时间不同。文件修改时间是否与文件名中的时间戳匹配?
  • 您好,我正在使用 sales.bat 文件运行 .txt 文件。 txt 脚本运行良好,除了 rm 部分。起初我给了 rm *.csv 然后所有文件都被删除了。我的问题是我需要删除 2 天前的文件。你能帮我如何根据我的文件名删除这些文件(sales_201705010315)
  • 所以不能根据文件修改时间来选择文件?
  • 我可以选择它们,但我每天都自动运行批处理文件
  • 我明白了。我的意思是“按文件时间戳自动选择”。好的,我认为这是不可能的。

标签: batch-file ftp winscp


【解决方案1】:

请注意,FTP 服务器上的文件将包含文件在 FTP 服务器上创建的日期/时间,而不是原始文件的日期/时间。因此,如果您的文件是由某个通宵运行的自动化任务传输的,则 FTP 服务器的日期/时间可能会有所不同。如果 FTP 服务器上的日期/时间未同步到时间服务器,您将遇到同样的问题。如果FTP发送机器和接收机器在不同的时区,你会遇到这个问题。

【讨论】:

  • "请注意,FTP 服务器上的文件将具有文件在 FTP 服务器上创建的日期/时间,而不是原始文件的日期/时间" - 如何你知道吗?这取决于上传者。
  • 知道了。我尝试以 rm %%timestamp -1d#yyyymmddhhss%% 运行。但这也没有删除这些文件。你能帮我如何更改脚本以匹配
  • “你怎么知道的?”从他的删除代码来看,我假设他正在使用类似的东西来上传文件,这将是一个 FTP 放置。他没有提到任何其他软件,但这是一个有效的观点。
  • 您能否在上传的文件的客户端保留日志,然后运行该日志,从文件名中提取日期/时间,并根据文件名而不是日期计算删除FTP 服务器?
  • @thx1138v2 该脚本使用 WinSCP,其put 确实更新上传的时间戳以匹配源文件 - 尽管下载脚本没有说明文件上传的方式,所以我们对此一无所知。
【解决方案2】:

这确实会删除文件“超过 1 天”(不是 2 天):

rm *<1D

file mask with time contraints

但该语法使用文件修改时间。

另见Delete files older than X days from FTP server with PowerShell or batch file

如果你需要根据名字中的时间戳来选择文件,那就更复杂了。


删除时间戳为 2 天的文件很容易:

rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv

这使用%TIMESTAMP% syntax with a relative time。该语法将使命令解析为(截至 2017-05-04):

rm Sales_20170502????.csv

但这不会删除 3 天或更长时间前的文件。如果您每天定期运行脚本,这不是问题。如果您想应对 1 天或几天的中断,您可以删除时间戳为 2、3、4... 天的文件,例如:

rm Sales_%TIMESTAMP-2D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-3D#yyyymmdd%????.csv
rm Sales_%TIMESTAMP-4D#yyyymmdd%????.csv
...

如果您真的想删除时间戳为 2 天或更多天的所有文件,则必须使用更强大的语言编写脚本。

PowerShell with use of WinSCP .NET assembly 中的示例:

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

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions

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

# Connect
Write-Host "Connecting..."
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)

Write-Host "Listing files..."
$remotePath = "/OUT"
$files = $session.ListDirectory($remotePath).Files

$prefix = "Sales_"
$twoDaysBack = (Get-Date).AddDays(-2)
$timestamp = $twoDaysBack.ToString("yyyyMMdd")

foreach ($file in $files)
{
    if (($file.Name.Length -gt ($prefix.Length + $timestamp.Length)) -and
        ($file.Name.SubString(0, $prefix.Length) -eq $prefix) -and
        ($file.Name.SubString($prefix.Length, $timestamp.Length) -le $timestamp))
    {
        $path = [WinSCP.RemotePath]::EscapeFileMask($file.FullName)
        $session.RemoveFiles($path).Check()
        Write-Host "Deleted $($file.Name)"
    } 
}

Write-Host "Done"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2015-06-06
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多