### Body

Similarly to SFTP (fixed in https://github.com/apache/airflow/pull/29068) the logic from __init__ should be moved to execute.

The #29068 provides a blueprint for that.

### Committer

- [X] I acknowledge that I am a maintainer/committer of the Apache Airflow project.
f"!= {len(self.remote_filepath)} paths in remote_filepath"
            )
        if self.operation.lower() not in [FTPOperation.GET, FTPOperation.PUT]:
            raise TypeError(
                f"Unsupported operation value {self.operation}, "
                f"expected {FTPOperation.GET} or {FTPOperation.PUT}."
            )
    @cached_property
    def hook(self) -> FTPHook:
        """Create and return an FTPHook."""
        return FTPHook(ftp_conn_id=self.ftp_conn_id)
    def execute(self, context: Any) -> str | list[str] | None:
        file_msg = None
        for local_filepath, remote_filepath in zip(self.local_filepath, self.remote_filepath):
            if self.operation.lower() == FTPOperation.GET:
                local_folder = os.path.dirname(local_filepath)
                if self.create_intermediate_dirs:
                    Path(local_folder).mkdir(parents=True, exist_ok=True)
                file_msg = f"from {remote_filepath} to {local_filepath}"
                self.log.info("Starting to transfer %s", file_msg)
                self.hook.retrieve_file(remote_filepath, local_filepath)
            else:
                remote_folder = os.path.dirname(remote_filepath)
                if self.create_intermediate_dirs:
                    self.hook.create_directory(remote_folder)
                file_msg = f"from {local_filepath} to {remote_filepath}"
                self.log.info("Starting to transfer file %s", file_msg)
                self.hook.store_file(remote_filepath, local_filepath)
        return self.local_filepath
class FTPSFileTransmitOperator(FTPFileTransmitOperator):