     path = path.replace /_([A-Z])/g, '$1'
     Path.basename path, Path.extname path
 
-# Now go through each existing content by ID, and process it:
-for idFileName in FS.readdir DIR_BY_ID_PATH, _
+# Now query all the IDs we have:
+echo 'Querying content files...'
+idFileNames = FS.readdir DIR_BY_ID_PATH, _
+totalNumIds = idFileNames.length
+echo "#{totalNumIds} files found."
+
+# Now go through each ID,and process it, outputting percentage every minute:
+echo 'Processing...'
+nextLogTime = Date.now() + 1000 * 60
+
+for idFileName, i in idFileNames
     # Skip non-content files:
     continue if (Path.extname idFileName) isnt '.json'
 

# - Adds our `ready`, `failed`, and `progress` properties.
#   Assumes all content we're processing finished successfully.
#
# - Moves the image info into a `dzi` container, if it isn't already.
#
# - Fixes the `tileSize` and `tileOverlap` properties from strings to ints.
#

        FS.symlink urlToIdPath, urlPath, _
    catch err
        throw err unless err.code is 'EEXIST'

    if Date.now() >= nextLogTime
        percent = 100 * (i + 1) / totalNumIds
        remaining = totalNumIds - (i + 1)
        echo "#{percent.toFixed 2}% processed; #{remaining} files remaining."

echo 'All done!'
