How to get the latest file out of each folder


Recently a user has asked via the website chat (the icon at the lower right corner) an interesting question:


I am looking for scriptable FTP to do the following… I have an FTP location with many folders(about 500.) I would like to get the latest file out of each folder. Or better yet, get the latest file out of a list of folders. Can your program do this recursive FTP?


The answer is yes. It is possible to get the latest file out of a list of folders. It is not a simple script but it is definitely possible. The steps needed are the following:

  • Store the list of remote folders where you want to look in a variable. Each item of the list is separated by the | character.
  • Use the FOREACH loop to run a set of FTP commands for each folder defined in the previous step
  • Use the command GETLIST to retrieve the list of files in a folder.
  • Use again the FOREACH loop to run a set of FTP commands for each file.
  • Retrieve the last modification time of the remote file using GETFILETIME and save it in a variable.
  • If it is the most recent modified time we have seen store also the path of the file.
  • Once all the files are processed go the next folder of the list.
  • When we have reached the end of the folder list download the file using the path we have saved in a variable.
The only drawback of this script is that it only handles the files in a folder directly, not files stored in subfolders. In other words, it does not go through a tree of subdirectories. But there is a workaround to this limitation: You can add the subfolder to the folder list as /myfolder/mysubfolder.
The full script and its output is:

# Connect to FTP server
# Set the list of folders to look into
$folders = "my folder 1|my folder 2|my folder 3| my folder 3/my subfolder"
# Save the currenct remote folder path for later
$root_folder = CWDIR()
# Here we will save the most recent file modified time found
$most_recent_modification_time =""
# And here the most recent file path
$most_recent_file_path =""
# For each folder in the previously defined list of folders
FOREACH $folder IN $folders
	# Show a message
	PRINT("Checking files in ".$folder)
	# Go to that folder
	# Get the list of files
	# For each file
	FOREACH $file IN $file_list
		# Get the last time that file was modified
		$last_modified_time = GETFILETIME(REMOTE,$file)
		# A message to track what the script is doing
		PRINT("Last modified time of ".$file." is ".$last_modified_time)
		# Is this modification time the most recent we have found?
		IF($most_recent_modification_time=="" OR $most_recent_modification_time<$last_modified_time)
			$most_recent_file_path = CWDIR()."/".$file
	# return to parent folder
# Download the most recent file among the set of folders defined at the top
# Close connection to the FTP server