input: Write a function to manage a task data repository using the FileSystem class. The function should be able to save task data, delete task data by ID, find task data by ID, find task data for multiple IDs, get all task data, and retrieve task data by ID without raising an error if not found. The function should take a parameter dictionary containing a 'taskDir' key to specify the storage directory. The methods to be used are save_task, delete_task, find_by_id, find_by_ids, all_task_data, and task_data.
  assert FileSystem({'taskDir': 'some_directory'}).save_task({'name': 'Task1', 'description': 'Description1'})['id'] is not None
  assert FileSystem({'taskDir': 'some_directory'}).find_by_id(1)['name'] == 'Task1'
  assert FileSystem({'taskDir': 'some_directory'}).delete_task(1) is None
  assert FileSystem({'taskDir': 'some_directory'}).task_data(1) is None
  assert FileSystem({'taskDir': 'some_directory'}).all_task_data() == []
output: def save_task(self, task_data):
      task_id = len(self.all_task_data()) + 1
      task_data['id'] = task_id
      with open(f"{self.params['taskDir']}/task_{task_id}.json", 'w') as f:
          json.dump(task_data, f)
      return task_data
  
  def delete_task(self, task_id):
      task_file = f"{self.params['taskDir']}/task_{task_id}.json"
      if os.path.exists(task_file):
          os.remove(task_file)
  
  def find_by_id(self, task_id):
      task_file = f"{self.params['taskDir']}/task_{task_id}.json"
      if os.path.exists(task_file):
          with open(task_file, '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):
      task_files = glob.glob(f"{self.params['taskDir']}/task_*.json")
      return [self.find_by_id(int(os.path.basename(f).split('_')[1].split('.')[0])) for f in task_files]
  
  def task_data(self, task_id):
      return self.find_by_id(task_id)