## How to traverse directories

When doing FTP commands to traverse the remote file system, there are a few different ways curl can proceed to reach the target file, the file the user wants to transfer.

### multicwd

curl can do one change directory (CWD) command for every individual directory down the file tree hierarchy. If the full path is `one/two/three/file.txt`, that method means doing three `CWD` commands before asking for the `file.txt` file to get transferred. This method thus creates quite a large number of commands if the path is many levels deep. This method is mandated by an early spec (RFC 1738) and is how curl acts by default:

``````curl --ftp-method multicwd ftp://example.com/one/two/three/file.txt
``````

This then equals this FTP command/response sequence (simplified):

``````> CWD one
< 250 OK. Current directory is /one
> CWD two
< 250 OK. Current directory is /one/two
> CWD three
< 250 OK. Current directory is /one/two/three
> RETR file.txt
``````

### nocwd

The opposite to doing one CWD for each directory part is to not change the directory at all. This method asks the server using the entire path at once and is thus very fast. Occasionally servers have a problem with this and it isn't purely standards-compliant:

``````curl --ftp-method nocwd ftp://example.com/one/two/three/file.txt
``````

This then equals this FTP command/response sequence (simplified):

``````> RETR one/two/three/file.txt
``````

### singlecwd

This is the in-between the other two FTP methods. This makes a single `CWD` command to the target directory and then it asks for the given file:

``````curl --ftp-method singlecwd ftp://example.com/one/two/three/file.txt
``````

This then equals this FTP command/response sequence (simplified):

``````> CWD one/two/three
< 250 OK. Current directory is /one/two/three
> RETR file.txt
``````