input: Write a function called FileSystem with a taskDir parameter to create a Python class that provides methods for saving, deleting, finding, and listing task data. The class should include the following methods:
  
  - save_task(data): A method to save task data. If the data dictionary does not include an 'id' key, one will be generated and added. The task data will be stored in a file within a subdirectory named after the task ID.
  - delete_task(task_id): A method to delete task data by its ID, removing the corresponding subdirectory.
  - find_by_id(task_id): A method to find task data by its ID, returning the task data as a dictionary.
  - find_by_ids(task_ids): A method to find task data for multiple IDs, returning a list of task data dictionaries.
  - all_task_data(order='asc'): A method to retrieve all task data, sorted by ID in ascending order by default (or descending if 'order' is set to 'desc').
  - task_data(task_id): A method to get task data for a specific ID without raising an error if the data is not found, returning the task data as a dictionary or None.
  
  assert FileSystem({'taskDir': 'tasks'}).save_task({'name': 'Task1'})['id'] is not None
  assert FileSystem({'taskDir': 'tasks'}).find_by_id('1') is not None
  assert FileSystem({'taskDir': 'tasks'}).find_by_ids(['1', '2']) == []
  assert FileSystem({'taskDir': 'tasks'}).all_task_data() == []
  assert FileSystem({'taskDir': 'tasks'}).task_data('1') is None
output: 
  import os
  import json
  import uuid
  
  class FileSystem:
      def __init__(self, taskDir):
          self.taskDir = taskDir['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_id = data['id']
          task_dir = os.path.join(self.taskDir, task_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
  
      def delete_task(self, task_id):
          task_dir = os.path.join(self.taskDir, task_id)
          if os.path.exists(task_dir):
              for root, dirs, files in os.walk(task_dir, topdown=False):
                  for name in files:
                      os.remove(os.path.join(root, name))
                  for name in dirs:
                      os.rmdir(os.path.join(root, name))
              os.rmdir(task_dir)
  
      def find_by_id(self, task_id):
          task_dir = os.path.join(self.taskDir, task_id)
          data_file = os.path.join(task_dir, 'data.json')
          if os.path.exists(data_file):
              with open(data_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, 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)
  