7 from hashlib import sha512 as hashfunc
10 def create_rand_name(size=None):
11 """ Create rand name using alphanumeric char.
12 Param size: size of str name.
18 size = random.randint(5, 15)
21 name += random.choice(string.hexdigits)
25 def create_rand_folder(directory):
26 """ Create rand folder in directory.
27 Param directory: folder where create new rand folder.
29 Return: path with new directory.
32 new_dir = os.path.join(directory, create_rand_name())
33 if not os.path.exists(new_dir):
36 new_dir = create_rand_folder(directory)
40 def create_rand_cad(size=1024):
41 """ Create rand str using hexadecimal char and hash sha512.
42 Param size: size in byte of str for generate.
47 cads = [hashfunc(create_rand_name().encode('utf-8')).hexdigest()]
49 for i in range(int(size / 128)):
50 last = hashfunc(last[:8].encode('utf-8')).hexdigest()
52 return ''.join(cads)[:size]
55 def create_file(path, size):
56 """ Get rand name using alphanumeric char.
57 Param size: size of str name.
62 filename = create_rand_name()
63 new_file = os.path.join(path, filename)
64 if not os.path.exists(new_file):
65 with open(new_file, 'w') as f:
66 f.write(create_rand_cad(size))
69 return create_file(path, size)
72 def generate_list_sizes(nfile, size, distribute_size):
73 """ Generate list of size for use it with create_files.
78 Param distribute_size: .
79 Type distribute_size: .
85 normal_size = int(size / nfile)
86 var = max(1, int(normal_size - normal_size * distribute_size / 100))
87 for s in range(nfile):
91 tmp_size = random.randint(normal_size - var, normal_size + var)
94 list_sizes.append(tmp_size + aux_size)
96 list_sizes.append(tmp_size)
100 def get_files_per_folder(nfile, ndir, distribute_files):
101 """ Get numbers of files for each folder.
106 Param distribute_files: .
107 Type distribute_files: .
108 Return: List of numbers.
113 f_per_dir = int(nfile / ndir)
114 f_remainder = int(nfile % ndir)
115 for d in range(ndir):
121 var = max(1, int(f_per_dir - f_per_dir * distribute_files / 100))
122 files += random.randint(f_per_dir - var, f_per_dir + var)
123 var = f_remainder - f_remainder * distribute_files // 100
124 files += random.randint(f_remainder - var, f_remainder + var)
127 list_files.append(files + aux_files)
129 list_files.append(files)
131 list_files[-1] += aux_files
135 def main(args = None):
136 parser = argparse.ArgumentParser(description='Wgeneration option. ')
137 parser.add_argument('--seed', type=int, action='store', help='Seed. ')
138 parser.add_argument('--ndir', type=int, action='store',
139 help='Number of directories for create. ')
140 parser.add_argument('--deep', type=int, action='store',
141 help='Percent for distribute deep.')
142 parser.add_argument('--nfile', type=int, action='store',
143 help='Number of files for create. ')
144 parser.add_argument('--size', type=int, action='store',
145 help='Total size of files (MB) ')
146 parser.add_argument('--distribute_files', type=int, action='store',
147 help='Percent for distribute files. ')
148 parser.add_argument('--distribute_size', type=int, action='store',
149 help='Percent to distribute size of files. ')
150 parser.add_argument('--path', action='store', help='Path to generate. ')
153 parsed_args = parser.parse_args()
155 parsed_args = parser.parse_args(args)
157 if parsed_args.seed is not None:
158 seed = parsed_args.seed
160 seed = random.randint(0, 1000000000)
162 if parsed_args.ndir is not None:
163 ndir = parsed_args.ndir
165 ndir = random.randint(0, 50000)
166 if parsed_args.deep is not None:
167 deep = parsed_args.deep
169 deep = random.randint(0, 100)
170 if parsed_args.nfile:
171 nfile = parsed_args.nfile
173 nfile = random.randint(1, 500000)
175 size = parsed_args.size * 1024 * 1024 # MB to byte
177 size = random.randint(1, 5000)
178 size = size * 1024 * 1024 # MB to byte
179 if parsed_args.distribute_files is not None:
180 distribute_files = parsed_args.distribute_files
182 distribute_files = random.randint(0, 100)
183 if parsed_args.distribute_size is not None:
184 distribute_size = parsed_args.distribute_size
186 distribute_size = random.randint(0, 100)
188 path = os.path.abspath(parsed_args.path)
189 if not os.path.exists(path):
194 print("Using seed %d: " % seed)
195 print("Generate %d folders with %d%% of deep." % (ndir, deep))
196 print("Generate %d files with total size %d MB." % (nfile,
198 print("\tDistribute (files, size): (%d%%, %d%%)." % (distribute_files,
201 list_dir = [[path, ndir, nfile]]
202 list_sizes = generate_list_sizes(nfile, size, distribute_size)
203 list_files = get_files_per_folder(nfile, ndir, distribute_files)
206 new_dir = create_rand_folder(list_dir[0][0])
208 for i in range(list_files[0]):
209 create_file(new_dir, list_sizes[i])
210 del list_sizes[:list_files[0]]
212 current_ndir = list_dir[0][1] - 1
213 if (current_ndir == 0):
216 ndir_deep = current_ndir * deep / 100
217 ndir_path = current_ndir - ndir_deep
219 list_dir.append([new_dir, ndir_deep])
221 list_dir[0][1] = ndir_path
227 if __name__ == "__main__":