This is an old revision of the document!
Search recursively for text in remote directory / Grep files over SFTP/FTP protocol
The following example uses WinSCP .NET assembly from a PowerShell script. If you have another preferred language, you can easily translate it.
You can run the script (e.g. search.ps1
) from WinSCP GUI using local custom command:
powershell.exe -File search.ps1 -path "!/" -text !?Text:?!
Advertisement
See also Listing files matching wildcard.
You can alter the script for other tasks, instead of grepping the matching files. You can for example remove or download the matching files. Just modify the action in if ($fileInfo.Name -Like $wildcard)
block accordingly.
param ( [Parameter(Mandatory)] $path, [Parameter(Mandatory)] $text, $wildcard = "*.*" ) function SearchDirectory ($session, $path, $wildcard, $text) { Write-Host ("Searching directory {0} ..." -f $path) $directoryInfo = $session.ListDirectory($path) foreach ($fileInfo in $directoryInfo.Files) { $filePath = ($path + "/" + $fileInfo.Name) if ($fileInfo.IsDirectory) { # Skip references to current and parent directories if (($fileInfo.Name -ne ".") -and ($fileInfo.Name -ne "..")) { # Recurse into subdirectory SearchDirectory $session $filePath $wildcard $text } } else { # Does file name match wildcard? if ($fileInfo.Name -Like $wildcard) { # Modify the code below if you want to do another task with # matching files, instead of grepping their contents Write-Host ("File {0} matches mask, searching contents..." -f $filePath) $tempPath = ($env:temp + "\" + $fileInfo.Name) # Download file to temporary directory $transferResult = $session.GetFiles($session.EscapeFileMask($filePath), $tempPath) # Did the download succeeded? if (!$transferResult.IsSuccess) { # Print error (but continue with other files) Write-Host $transferResult.Failures[0].Message } else { # Search and print lines containing "text". # Use -Pattern instead of -SimpleMatch for regex search $matchInfo = Select-String -Path $tempPath -SimpleMatch $text # Print the results foreach ($match in $matchInfo) { Write-Host ($filePath + ":" + $match.LineNumber + ":" + $match.Line) } # Delete temporary local copy Remove-Item $tempPath } } } } } try { # Load WinSCP .NET assembly Add-Type -Path "WinSCPnet.dll" # Setup session options $sessionOptions = New-Object WinSCP.SessionOptions $sessionOptions.Protocol = [WinSCP.Protocol]::Sftp $sessionOptions.HostName = "example.com" $sessionOptions.UserName = "user" $sessionOptions.Password = "mypassword" $sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" $session = New-Object WinSCP.Session try { # Connect $session.Open($sessionOptions) # Start recursive search SearchDirectory $session $path $wildcard $text } finally { # Disconnect, clean up $session.Dispose() } exit 0 } catch [Exception] { Write-Host $_.Exception.Message exit 1 }
Advertisement