Find FTP files
Description
Finds files and directories on an FTP/SFTP server and returns them as an array of FTP file objects carrying name, path, size, modified time, type, and an exists flag. Filter by entry type, match names against a glob pattern, and optionally recurse into subdirectories (symbolic links are treated as files and never followed). Wire a result into Open/Remove/Move FTP file, or into a Break node to read its fields. Branches on success/error.
When to use
Use Find FTP files to discover files and directories in a directory tree on
a remote FTP, FTPS, or SFTP server. Wire the output into a For each loop,
then Break each element (a Break FTP file node) to read its path, name,
and size fields. Set Recursive to descend into subdirectories — symbolic
links are always reported as plain files and never followed, so there’s no
risk of cycles, but traversal is capped at depth 16 and 10,000 entries;
exceeding either cap takes the Error pin rather than silently truncating
the results. Sizes over 2 GiB are clamped to the maximum integer value, and
directories always report size 0. Feed the resulting file objects straight
into Open, Remove, or Move FTP file — they carry their own server
connection, so those nodes don’t need a separate Credentials input. Handle
the Error pin to recover from missing directories, an invalid Pattern, or
connection failures.
Pins
Input pins
| Pin | Type | Default | Notes |
|---|---|---|---|
| Credentials | FTP credentials | — | FTP credentials produced by an FTP credentials node. |
| Path | string | . | Directory to search. Defaults to `.` (the session's working directory). Format follows the server's conventions (e.g. `/incoming` on most Unix servers). |
| Type | enum(FtpEntryFilter) | BOTH | Filters entries by kind — `FILE`, `DIRECTORY`, or `BOTH` (default). Only affects which entries are returned, not which directories are traversed when Recursive is enabled. |
| Recursive | boolean | — | When true, recurses into subdirectories. Symbolic links are always reported as files and are never followed, so recursion cannot cycle. |
| Pattern | string | — | Glob matched against each entry's base name (not its full path), using Go's `path.Match` syntax: `*`, `?`, and `[...]` character classes. Empty (the default) matches every entry. Like Type, this only filters what's returned — it never blocks traversal into non-matching directories. |
Output pins
| Pin | Type | Notes |
|---|---|---|
| Files | FTP file[] | FTP file objects found on the server. Break an element to read its name, path, size, modified time, type, and exists fields, or wire it directly into Open, Remove, or Move FTP file — the file object carries its own server connection, so those nodes don't need credentials. |
Execution pins
| Pin | Direction |
|---|---|
| In | Input |
| Success | Output |
| Error | Output |
Example
Process every CSV in an SFTP inbox tree, including subdirectories. Wire FTP
username/password credentials (Protocol SFTP) into Find FTP files, set
Path to /inbox, Recursive to true, and Pattern to *.csv, then on
Success pass Files to a For each loop. Inside the loop, wire the element
into Break FTP file to read its Path field, feed the same element into Open
FTP file to read the stream, and after processing it, wire the element into
Remove FTP file to clear it from the inbox — no credentials needed on
either downstream node, since the file object already knows its server.