input: 
  class FileSystem(object):
      """The FileSystem class provides methods for managing task data in a file system.
      It includes methods to save, delete, find, and retrieve task data by ID or multiple IDs.
      To use this class, instantiate it with a parameter dictionary that includes a 'taskDir' key
      specifying the directory where task data should be stored. Then call the methods on the instance as needed:
  
      - `save_task(data)` saves task data. If the data dictionary does not already include an 'id' key,
        one will be generated and added to the dictionary. The task data will be stored in a file in a subdirectory
        of the taskDir directory named after the task ID.
      - `delete_task(task_id)` deletes the task data associated with the given task ID, removing the corresponding subdirectory.
      - `find_by_id(task_id)` finds the task data for the given task ID and returns it as a dictionary.
      - `find_by_ids(task_ids)` finds the task data for multiple given IDs and returns a list of task data dictionaries.
      - `all_task_data(order='asc')` returns all task data as a list of dictionaries, sorted by ID in ascending order by default.
        The order can be changed to descending by setting the 'order' parameter to 'desc'.
      - `task_data(task_id)` retrieves task data for a specific ID without raising an error if the data is not found.
        It returns the task data as a dictionary, or None if the task data is not found.
  
      Example:
      >>> fs = FileSystem({'taskDir': '/tmp/tasks'})
      >>> fs.save_task({'name': 'Task1', 'description': 'This is a sample task'})
      >>> fs.find_by_id('1')
      {'id': '1', 'name': 'Task1', 'description': 'This is a sample task'}
      >>> fs.all_task_data()
      [{'id': '1', 'name': 'Task1', 'description': 'This is a sample task'}]
      """
  
output:     
      def __init__(self, params):
          self.taskDir = params['taskDir']
          if not os.path.exists(self.taskDir):
              os.makedirs(self.taskDir)
  
      def save_task(self, data):
          if 'id' not in data:
              data['id'] = str(uuid.uuid4())
          task_dir = os.path.join(self.taskDir, data['id'])
          os.makedirs(task_dir, exist_ok=True)
          with open(os.path.join(task_dir, 'data.json'), 'w') as f:
              json.dump(data, f)
          return data['id']
  
      def delete_task(self, task_id):
          task_dir = os.path.join(self.taskDir, task_id)
          if os.path.exists(task_dir):
              shutil.rmtree(task_dir)
  
      def find_by_id(self, task_id):
          task_dir = os.path.join(self.taskDir, task_id)
          if os.path.exists(task_dir):
              with open(os.path.join(task_dir, 'data.json'), 'r') as f:
                  return json.load(f)
          return None
  
      def find_by_ids(self, task_ids):
          return [self.find_by_id(task_id) for task_id in task_ids if self.find_by_id(task_id) is not None]
  
      def all_task_data(self, order='asc'):
          task_ids = [d for d in os.listdir(self.taskDir) if os.path.isdir(os.path.join(self.taskDir, d))]
          if order == 'desc':
              task_ids.sort(reverse=True)
          else:
              task_ids.sort()
          return [self.find_by_id(task_id) for task_id in task_ids]
  
      def task_data(self, task_id):
          return self.find_by_id(task_id)
  