Удаление удаленных файлов .csv с отметкой времени в их именах старше 2 дней

Я пытаюсь удалить удаленные (.csv) файлы на FTP-сервере старше двух дней.

Для файлов неправильно установлено время последнего изменения. Я полагаюсь на метку времени в их именах.

Имя файла похоже на Sales_201705010315.csv (дата и время).

Мой текущий сценарий WinSCP:

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

Когда я запускаю скрипт, файлы не удаляются. Может кто-нибудь исправить мой скрипт


person swetha    schedule 02.05.2017    source источник
comment
Как вы запускаете .txt файл? Вроде как сценарий WinSCP, но вы не упомянули WinSCP + В чем вопрос? Скрипт выглядит неплохо. Если он не работает так, как вам хотелось бы, вы должны сообщить нам, что не так! + Хотя почему вы используете *<1D, если хотите выбрать файлы двухдневной давности? + Вы действительно можете выбрать файлы по времени их модификации? Потому что в вашем сообщении указано, что в именах файлов есть отметки времени. Это не то же самое, что время модификации файла, которое используется *<1D. Время модификации файла совпадает с отметкой времени в именах файлов или нет?   -  person Martin Prikryl    schedule 02.05.2017
comment
Привет, я запускаю файл .txt, используя файл sales.bat. Скрипт txt работает нормально, за исключением раздела rm. Сначала дал rm * .csv, потом все файлы удалили. Мой вопрос: мне нужно удалить файлы двухдневной давности. Можете ли вы помочь мне, как удалить эти файлы на основе моего имени файла (sales_201705010315)   -  person swetha    schedule 03.05.2017
comment
Значит, невозможно выбрать файлы по времени модификации файла?   -  person Martin Prikryl    schedule 03.05.2017
comment
Я могу их выбрать, но я автоматически запускаю командный файл каждый день.   -  person swetha    schedule 03.05.2017
comment
Я понимаю. Я имел в виду автоматический выбор по метке времени файла. Хорошо, я предполагаю, что это невозможно.   -  person Martin Prikryl    schedule 04.05.2017


Ответы (2)


Это действительно приведет к удалению файлов «старше 1 дня» (а не 2 дней):

rm *<1D

См. маску файла с временными ограничениями.

Но этот синтаксис использует время модификации файла.

См. Также Удаление файлов старше X дней с FTP-сервера с помощью PowerShell или пакетного файла.

Если вам нужно выбрать файлы на основе отметки времени в их именах, это сложнее.


Легко удалить файлы с отметкой времени 2 дня назад:

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

Здесь используется %TIMESTAMP% синтаксис с относительным временем. Синтаксис приведет к разрешению команды (по состоянию на 04.05.2017):

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 с использованием сборки WinSCP .NET:

# 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"
person Martin Prikryl    schedule 04.05.2017

Имейте в виду, что файл на FTP-сервере будет иметь дату / время создания файла на FTP-сервере, а не дату / время исходного файла. Поэтому, если ваш файл был передан какой-то автоматизированной задачей, которая запускается за ночь, дата и время FTP-сервера могут быть другими. Если дата и время на FTP-сервере не синхронизируются с сервером времени, вы столкнетесь с той же проблемой. И вы можете столкнуться с проблемой, если передающая и принимающая машины FTP находятся в разных часовых поясах.

person thx1138v2    schedule 02.05.2017
comment
Имейте в виду, что файл на FTP-сервере будет иметь дату / время создания файла на FTP-сервере, а не дату / время исходного файла - Откуда вы знаете? Это зависит от пользователя, загрузившего файл. - person Martin Prikryl; 03.05.2017
comment
понятно. Я попытался запустить как rm %% timestamp -1d # yyyymmddhhss %%. Но это также не удалило эти файлы. Можете ли вы мне помочь, как изменить сценарий, чтобы он соответствовал - person swetha; 03.05.2017
comment
Откуда вы знаете? Судя по его коду удаления, я предполагаю, что он использует что-то похожее для загрузки файлов, и это будет FTP-сервер. Он не упомянул о каком-либо другом программном обеспечении, но это верная точка зрения. - person thx1138v2; 04.05.2017
comment
Можете ли вы вести журнал загруженных файлов на стороне клиента, а затем просматривать его, извлекать дату / время из имени файла и удалять на основе имени файла, а не расчета даты на FTP-сервере? - person thx1138v2; 04.05.2017
comment
@ thx1138v2 Сценарий использует WinSCP, put которого обновляет загруженную метку времени, чтобы она соответствовала исходному файлу. Хотя сценарий загрузки ничего не говорит о способе загрузки файлов, поэтому мы не знаем об этом. - person Martin Prikryl; 04.05.2017