├── .github ├── linters │ ├── .isort.cfg │ └── .python-black └── workflows │ ├── superlinter.yml │ └── tests.yml ├── .gitignore ├── .prettierrc.js ├── .vscode └── settings.json ├── README.md ├── dff.py ├── pyproject.toml ├── test ├── different_file_sizes │ ├── big aaa.txt │ └── big bbb.txt ├── duplicate_across_folders │ ├── master.txt │ ├── sub1 │ │ ├── dupe.txt │ │ └── supersub │ │ │ └── also_dupe.txt │ └── sub2 │ │ └── dupe.txt ├── filename_length │ ├── aaaaaa.txt │ ├── bbbb.txt │ ├── cc.txt │ ├── dddddddd.txt │ ├── ee.txt │ └── ff01234567890.txt ├── large_duplicates │ ├── aaa.txt │ ├── bbb.txt │ └── bbb_dupe.txt ├── many_large_almost_duplicate │ ├── big aaa.txt │ ├── big bbb.txt │ └── big ccc.txt ├── one_file │ └── one file.txt ├── one_large_almost_duplicate │ ├── big aaa.txt │ └── big bbb.txt ├── one_large_duplicate │ ├── big aaa.txt │ └── big bbb.txt ├── one_small_duplicate │ ├── aaa.txt │ └── bbb.txt ├── two_large_duplicates │ ├── big aaa.txt │ ├── big bbb.txt │ └── big ccc.txt ├── two_small_duplicates │ ├── aaa.txt │ ├── bbb.txt │ └── ccc.txt └── two_zero_byte_files │ ├── yyy.txt │ └── zzz.txt └── test_dff.py /.github/linters/.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | line_length = 120 3 | -------------------------------------------------------------------------------- /.github/linters/.python-black: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qarj/duplicate-file-finder/40cedcc45041b9c38f9fe306bd4127bb06a3d53f/.github/linters/.python-black -------------------------------------------------------------------------------- /.github/workflows/superlinter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Lint Code Base 3 | 4 | on: push 5 | 6 | jobs: 7 | super-lint: 8 | name: Lint Code Base 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout code 12 | uses: actions/checkout@v2 13 | 14 | - name: Investigation 1 15 | run: ls -asl 16 | 17 | - name: Investigation 2 18 | run: ls -asl "$GITHUB_WORKSPACE" 19 | 20 | - name: Investigation 3 21 | run: pwd 22 | 23 | - name: Investigation 4 24 | run: echo "$GITHUB_WORKSPACE" 25 | 26 | - name: Lint Code Base 27 | uses: github/super-linter@v4 28 | env: 29 | DEFAULT_BRANCH: master 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | LINTER_RULES_PATH: / 32 | PYTHON_BLACK_CONFIG_FILE: pyproject.toml 33 | PYTHON_ISORT_CONFIG_FILE: ./.github/linters/.isort.cfg 34 | VALIDATE_PYTHON_ISORT: false 35 | VALIDATE_YAML: false 36 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Tests 3 | 4 | on: push 5 | 6 | jobs: 7 | test: 8 | name: Tests 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout code 12 | uses: actions/checkout@v2 13 | 14 | - name: Set up Python 15 | uses: actions/setup-python@v2 16 | 17 | - name: Python version investigation 18 | run: python --version 19 | 20 | - name: OS investigation 21 | run: uname -a 22 | 23 | - name: Run the tests 24 | run: python test_dff.py 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /__pycache__ 2 | *.class 3 | delete_unit_test 4 | delete_filename_length -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | printWidth: 120, 4 | tabWidth: 4, 5 | singleQuote: true, 6 | quoteProps: 'consistent', 7 | trailingComma: 'all', 8 | useTabs: false, 9 | }; 10 | // https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "[python]": { 4 | "editor.defaultFormatter": null 5 | }, 6 | "python.formatting.provider": "black", 7 | "python.formatting.autopep8Args": ["--max-line-length=120"], 8 | "editor.formatOnSave": true, 9 | "editor.formatOnPaste": false 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # duplicate-file-finder 0.10.0 2 | 3 | [![GitHub Super-Linter](https://github.com/Qarj/duplicate-file-finder/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) 4 | ![Tests](https://github.com/Qarj/duplicate-file-finder/workflows/Tests/badge.svg) 5 | 6 | Very quickly find files with duplicate content, and optionally delete duplicates. 7 | 8 | This Python 3 script first checks all file sizes at the target path tree. 9 | Files are added to a list where the file size is common with one or more other files. 10 | 11 | Then the script computes the Blake2 64 byte hash of the first 4096 bytes of a file (NTFS default sector size) and stores it. 12 | 13 | Only if another file is found with the same Blake2 hash snippet, the full Blake2 of both files is computed to confirm duplicate. 14 | 15 | This double Blake2 compute strategy makes it extremely unlikely that two files will be declared identical when they are not. 16 | 17 | Zero byte files are ignored, but counted. 18 | 19 | File symlinks to nowhere are ignored, but counted. 20 | 21 | All files in the specified path, and all subfolders, are evaluated. Folder symlinks are not followed. 22 | 23 | ## Usage 24 | 25 | These examples assume `dff` has been added to your `PATH` - see below for installation instructions. 26 | 27 | List duplicates: 28 | 29 | ```sh 30 | dff --path test/one_small_duplicate 31 | ``` 32 | 33 | Or to search from current folder: 34 | 35 | ```sh 36 | dff --path . 37 | ``` 38 | 39 | Pretend to delete dupes, does not delete anything: 40 | 41 | ```sh 42 | dff --path test/duplicate_across_folders --delete --trial 43 | ``` 44 | 45 | Really delete duplicates - careful !!! - deletes read only files too: 46 | 47 | ```sh 48 | dff.py --path test/duplicate_across_folders --delete 49 | ``` 50 | 51 | Delete the file with the shorter filename rather than always the file currently being processed: 52 | 53 | ```sh 54 | dff.py --path test/duplicate_across_folders --delete --shorter 55 | ``` 56 | 57 | When using this option, some multiple duplicates of a file might be missed. In that case you'll need to run 58 | the script again. A message at script completion will tell you if this is the case. 59 | 60 | This option is recommended for where you have photos and have taken the trouble to give a meaningful description 61 | to the photo content - you'll want to keep the longer filename rather than just the basic automatically given name. 62 | 63 | ## Debian / Ubuntu Installation 64 | 65 | Clone project then add to path using symbolic link 66 | 67 | ```sh 68 | cd ~ 69 | sudo git clone https://github.com/Qarj/duplicate-file-finder 70 | cd duplicate-file-finder 71 | chmod +x dff.py 72 | sudo ln -sf $HOME/git/duplicate-file-finder/dff.py /usr/local/bin/dff 73 | ``` 74 | 75 | Check working 76 | 77 | ```sh 78 | dff --help 79 | ``` 80 | 81 | ## Windows Installation 82 | 83 | Copy `dff.py` to `C:\Windows` then you can run it from anywhere as `dff.py`. 84 | 85 | ## Run the unit tests 86 | 87 | Unit tests must be run with the project folder as the current folder. 88 | 89 | Linux 90 | 91 | ```sh 92 | python test_dff.py 93 | ``` 94 | 95 | Windows 96 | 97 | ```sh 98 | test_dff.py 99 | ``` 100 | -------------------------------------------------------------------------------- /dff.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import argparse 3 | import hashlib 4 | import os 5 | import stat 6 | import sys 7 | import time 8 | 9 | version = "0.10.0" 10 | 11 | 12 | # Flags 13 | verbose_output = None 14 | output_immediately = None 15 | trial_delete = None 16 | delete_shorter = None 17 | 18 | # Globals 19 | stdout = "" 20 | megabytes_scanned = 0 21 | failed_delete_count = 0 22 | 23 | # Constants 24 | BYTES_IN_A_MEGABYTE = 1048576 25 | BYTES_TO_SCAN = 4096 26 | SCAN_SIZE_MB = BYTES_TO_SCAN / BYTES_IN_A_MEGABYTE 27 | 28 | 29 | def clear_globals_for_unittests(): 30 | global stdout 31 | global megabytes_scanned 32 | stdout = "" 33 | megabytes_scanned = 0 34 | 35 | 36 | def set_verbose_output(b): 37 | global verbose_output 38 | verbose_output = b 39 | 40 | 41 | def set_output_immediately(b): 42 | global output_immediately 43 | output_immediately = b 44 | 45 | 46 | def set_trial_delete(b): 47 | global trial_delete 48 | trial_delete = b 49 | 50 | 51 | def set_delete_shorter(b): 52 | global delete_shorter 53 | delete_shorter = b 54 | 55 | 56 | class fileFullHash: 57 | 58 | full: dict = {} 59 | 60 | def __init__(self): 61 | self.full.clear() 62 | 63 | def search_duplicate(self, snip_file_path, current_file_path): 64 | current_file_hash = self.hash_full(current_file_path) 65 | if current_file_hash in self.full: 66 | return self.full[current_file_hash] 67 | 68 | snip_file_hash = self.hash_full(snip_file_path) 69 | self.full[snip_file_hash] = snip_file_path 70 | if current_file_hash in self.full: 71 | return self.full[current_file_hash] 72 | 73 | self.full[current_file_hash] = current_file_path 74 | return False 75 | 76 | def hash_full(self, file_path): 77 | global megabytes_scanned 78 | verbose("...calculating full hash of " + file_path) 79 | file_hash = hashlib.blake2b() 80 | with open(file_path, "rb") as f: 81 | for chunk in iter(lambda: f.read(BYTES_TO_SCAN), b""): 82 | file_hash.update(chunk) 83 | megabytes_scanned += SCAN_SIZE_MB 84 | return file_hash.hexdigest() 85 | 86 | 87 | def hash_snip(file_path): 88 | global megabytes_scanned 89 | verbose("...calculating hash snippet of " + file_path) 90 | snip_hash = hashlib.blake2b() 91 | try: 92 | with open(file_path, "rb") as f: 93 | for chunk in iter(lambda: f.read(BYTES_TO_SCAN), b""): 94 | snip_hash.update(chunk) 95 | f.close() 96 | megabytes_scanned += SCAN_SIZE_MB 97 | return snip_hash.hexdigest() 98 | except PermissionError: 99 | output("PermissionError: " + file_path + "\n") 100 | return "PermissionError:" + file_path 101 | 102 | 103 | def verbose(out): 104 | if verbose_output: 105 | return output(out) 106 | return 107 | 108 | 109 | def output(out): 110 | global stdout 111 | if output_immediately: 112 | unicode_output(out) 113 | else: 114 | stdout += out + "\n" 115 | 116 | 117 | def unicode_output(out): 118 | # when printing directly to the windows console stdout, unicode errors tend to be ignored automatically 119 | # if the user redirects stdout to a file, unicode errors can occur 120 | # this code outputs the best it can and flags errors in the output 121 | try: 122 | print(out, flush=True) 123 | except UnicodeEncodeError: 124 | try: 125 | print(out.encode("utf8").decode(sys.stdout.encoding)) 126 | except UnicodeDecodeError: 127 | print(out.encode("utf8").decode(sys.stdout.encoding, errors="ignore") + " <-- UnicodeDecodeError") 128 | 129 | 130 | def dff(path, delete_duplicates=False): 131 | output("\n" + time.strftime("%X : ") + "Finding duplicate files at " + path + "\n") 132 | start_time = time.time() 133 | 134 | sizes = fileSizes() 135 | sizes.find_files_with_duplicate_file_size(path) 136 | 137 | snip = dict() 138 | full_hash = fileFullHash() 139 | 140 | duplicate_count = 0 141 | file_count = 0 142 | 143 | for current_file_path in sizes.files_list: 144 | file_count += 1 145 | verbose("Processing file " + current_file_path) 146 | current_file_snip_hash = hash_snip(current_file_path) 147 | if current_file_snip_hash in snip: 148 | dupe_file_path = full_hash.search_duplicate(snip[current_file_snip_hash], current_file_path) 149 | if dupe_file_path: 150 | display_duplicate_and_optionally_delete(dupe_file_path, current_file_path, delete_duplicates) 151 | duplicate_count += 1 152 | else: 153 | verbose("...first 4096 bytes are the same, but files are different") 154 | else: 155 | snip[current_file_snip_hash] = current_file_path 156 | 157 | output( 158 | "\n" 159 | + time.strftime("%X : ") 160 | + str(duplicate_count) 161 | + " duplicate files found, " 162 | + str(file_count) 163 | + " files and " 164 | + str(megabytes_scanned) 165 | + " megabytes scanned in " 166 | + str(round(time.time() - start_time, 3)) 167 | + " seconds, " 168 | + str(sizes.file_count) 169 | + " files assessed" 170 | ) 171 | 172 | if failed_delete_count: 173 | output("\n" + "failed to delete " + str(failed_delete_count) + " duplicates - rerun script") 174 | 175 | return stdout 176 | 177 | 178 | class fileSizes: 179 | 180 | sizes: dict = {} 181 | files_to_process: dict = {} 182 | files_list: list = [] # want to process files in os.walk order, not some unknown order 183 | file_count = 0 184 | 185 | def __init__(self): 186 | self.sizes.clear() 187 | self.files_to_process.clear() 188 | self.files_list.clear() 189 | 190 | def find_files_with_duplicate_file_size(self, path): 191 | self.file_count = 0 192 | for root, _, files in sorted(os.walk(path)): 193 | files.sort() 194 | for file_name in files: 195 | self.file_count += 1 196 | current_file_path = os.path.join(root, file_name) 197 | verbose("Checking size of file " + current_file_path) 198 | try: 199 | file_size = os.path.getsize(current_file_path) 200 | except FileNotFoundError: # in case of symlink to nowhere 201 | continue 202 | if file_size > 0: 203 | self.add_file(current_file_path, file_size) 204 | 205 | def add_file(self, current_file_path, size): 206 | if size in self.sizes: 207 | verbose(current_file_path + " has non unique file size [" + str(size) + " bytes]") 208 | self.add_original_file_to_process_list(self.sizes[size]) 209 | self.add_file_to_process_list(current_file_path) 210 | else: 211 | self.sizes[size] = current_file_path 212 | 213 | def add_original_file_to_process_list(self, original_file_path): 214 | if original_file_path in self.files_to_process: 215 | verbose(original_file_path + " is a known size duplicate") 216 | return 217 | self.add_file_to_process_list(original_file_path) 218 | 219 | def add_file_to_process_list(self, file_path): 220 | self.files_to_process[file_path] = True 221 | self.files_list.append(file_path) 222 | verbose(file_path + " added to process list") 223 | 224 | 225 | def display_duplicate_and_optionally_delete(previously_hashed_file_path, current_file_path, delete_duplicates): 226 | 227 | current_file_message = " " 228 | previously_hashed_file_message = "" 229 | if delete_duplicates: 230 | previously_hashed_file_message, current_file_message = delete_duplicate_and_get_message( 231 | previously_hashed_file_path, current_file_path 232 | ) 233 | 234 | output( 235 | current_file_message 236 | + current_file_path 237 | + "\n is dupe of " 238 | + previously_hashed_file_path 239 | + previously_hashed_file_message 240 | + "\n" 241 | ) 242 | 243 | 244 | def delete_duplicate_and_get_message(previously_hashed_file_path, current_file_path): 245 | 246 | delete_file_path = current_file_path 247 | previously_hashed_file_message = "" 248 | current_file_message = "deleted ... " 249 | 250 | if delete_shorter: 251 | if len(os.path.basename(previously_hashed_file_path)) < len(os.path.basename(current_file_path)): 252 | delete_file_path = previously_hashed_file_path 253 | previously_hashed_file_message = " ... deleted" 254 | current_file_message = " " 255 | 256 | if not trial_delete: 257 | try: 258 | os.chmod(delete_file_path, stat.S_IWRITE) 259 | os.remove(delete_file_path) 260 | except FileNotFoundError: 261 | # only the previously hashed file could have been deleted and 262 | # not the current file (unless user is deleting files outside of this script!) 263 | previously_hashed_file_message = " ... already deleted" 264 | global failed_delete_count 265 | failed_delete_count += 1 266 | 267 | return previously_hashed_file_message, current_file_message 268 | 269 | 270 | parser = argparse.ArgumentParser(description="Find duplicate files in target path and sub folders.") 271 | parser.add_argument("--path", dest="path", required=False, action="store", help="Target path") 272 | parser.add_argument("--version", action="version", version=version) 273 | parser.add_argument( 274 | "--verbose", action="store_true", dest="verbose", default=False, help="Will output extra info on logic" 275 | ) 276 | parser.add_argument( 277 | "--delayed", 278 | action="store_true", 279 | dest="output_delayed", 280 | default=False, 281 | help="Will display stdout at end instead of immediately", 282 | ) 283 | parser.add_argument( 284 | "--delete", action="store_true", dest="delete", default=False, help="Deletes any duplicate files found" 285 | ) 286 | parser.add_argument( 287 | "--trial", 288 | action="store_true", 289 | dest="trial_delete", 290 | default=False, 291 | help="Displays files to delete without actually deleting them - use with --delete", 292 | ) 293 | parser.add_argument( 294 | "--shorter", 295 | action="store_true", 296 | dest="delete_shorter", 297 | default=False, 298 | help="Deletes file with shorter name rather than always current file - use with --delete", 299 | ) 300 | 301 | args = parser.parse_args() 302 | set_verbose_output(args.verbose) 303 | set_output_immediately(not args.output_delayed) 304 | set_trial_delete(args.trial_delete) 305 | set_delete_shorter(args.delete_shorter) 306 | 307 | if args.path: 308 | dff(args.path, args.delete) 309 | if not output_immediately: 310 | print("\nResults...\n") 311 | unicode_output(stdout) 312 | sys.exit() 313 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.black] 2 | line-length = 120 3 | -------------------------------------------------------------------------------- /test/different_file_sizes/big aaa.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/different_file_sizes/big bbb.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus surprise me -------------------------------------------------------------------------------- /test/duplicate_across_folders/master.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis NULLA maximus posuere. -------------------------------------------------------------------------------- /test/duplicate_across_folders/sub1/dupe.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis NULLA maximus posuere. -------------------------------------------------------------------------------- /test/duplicate_across_folders/sub1/supersub/also_dupe.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis NULLA maximus posuere. -------------------------------------------------------------------------------- /test/duplicate_across_folders/sub2/dupe.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis NULLA maximus posuere. -------------------------------------------------------------------------------- /test/filename_length/aaaaaa.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/filename_length/bbbb.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/filename_length/cc.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/filename_length/dddddddd.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/filename_length/ee.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/filename_length/ff01234567890.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/large_duplicates/aaa.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/large_duplicates/bbb.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus surprise -------------------------------------------------------------------------------- /test/large_duplicates/bbb_dupe.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus surprise -------------------------------------------------------------------------------- /test/many_large_almost_duplicate/big aaa.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/many_large_almost_duplicate/big bbb.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus surprise -------------------------------------------------------------------------------- /test/many_large_almost_duplicate/big ccc.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus SURPRISE -------------------------------------------------------------------------------- /test/one_file/one file.txt: -------------------------------------------------------------------------------- 1 | Not much -------------------------------------------------------------------------------- /test/one_large_almost_duplicate/big aaa.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/one_large_almost_duplicate/big bbb.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus surprise -------------------------------------------------------------------------------- /test/one_large_duplicate/big aaa.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/one_large_duplicate/big bbb.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/one_small_duplicate/aaa.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/one_small_duplicate/bbb.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/two_large_duplicates/big aaa.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/two_large_duplicates/big bbb.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/two_large_duplicates/big ccc.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempor ac ex eget pulvinar. In imperdiet sem vitae fermentum feugiat. Phasellus interdum ligula eget erat elementum consequat. Donec volutpat, dolor id fringilla auctor, quam diam aliquam nibh, eu sodales orci purus quis nisi. Sed fermentum vehicula sodales. Cras ut elit a quam vulputate faucibus eget a neque. Praesent metus purus, euismod in bibendum et, gravida nec dui. Integer a metus mattis, luctus sem eu, ullamcorper purus. Nunc lacus diam, luctus at hendrerit a, placerat at nibh. Integer sagittis elit mi, ac ornare ante porttitor non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Phasellus felis dolor, lobortis vel fringilla vel, tempor eget lacus. 2 | 3 | Vivamus pharetra augue tortor, vitae ullamcorper augue bibendum a. Sed porta mollis lorem eu sagittis. Sed interdum turpis et orci aliquet porttitor. Integer fringilla nunc vel suscipit ultricies. Nam dapibus ante eu enim ultrices blandit. Nullam quis ultricies lorem. Duis accumsan fringilla congue. Fusce condimentum arcu a neque tristique lobortis. Ut nec egestas sem. Aliquam a faucibus dolor. Nulla bibendum libero quis porta euismod. In hac habitasse platea dictumst. Integer tempor tellus turpis, vitae aliquam nisi ultricies sit amet. Sed vel auctor mi. 4 | 5 | Suspendisse egestas leo velit, ut tempus odio gravida ultrices. Vivamus ut ultricies mauris. Integer a magna enim. Praesent ut sem vulputate mauris accumsan ultrices. Ut nulla sapien, venenatis vitae imperdiet non, consequat in tortor. Duis nec blandit mauris, nec iaculis nibh. Phasellus tempus consectetur lorem quis auctor. Nunc aliquet purus tellus, vel ultricies tellus sodales ac. Mauris rhoncus tortor eu fermentum pharetra. Curabitur enim turpis, pellentesque at rutrum ac, fringilla eu nisi. Curabitur maximus congue consequat. Donec id massa vitae quam tristique commodo. Quisque quis risus dolor. Nunc nec sodales leo. 6 | 7 | Ut pulvinar consectetur neque non ultricies. Sed tincidunt massa eu mi sollicitudin ornare. In eget ex porta, consectetur felis in, ullamcorper lectus. Nunc sed luctus urna, at luctus mi. Suspendisse ac felis enim. Pellentesque odio risus, semper eget maximus quis, hendrerit in magna. In viverra, purus eu varius porttitor, orci lectus fringilla purus, ac rutrum mi velit ac odio. 8 | 9 | Curabitur egestas nisl eget enim vehicula, id tristique felis dapibus. Mauris dictum nisl ac nisi porttitor, eu vehicula mauris sodales. Cras interdum pulvinar augue, quis placerat sapien dignissim nec. Proin eu pharetra ligula. Quisque porttitor lectus ut diam elementum, ac ullamcorper urna consequat. Aliquam aliquet libero leo, et pharetra mauris ornare a. Pellentesque vitae ante felis. In interdum non est eget tincidunt. Nulla ac dui sagittis, varius nisi et, tincidunt velit. Nam ut turpis neque. Mauris vel blandit est. Donec ut convallis est. Vivamus porta eu ante eu lobortis. Proin vitae dictum purus. 10 | 11 | Donec fermentum lectus vitae mollis porttitor. Mauris eget ipsum mauris. Maecenas quis leo eu sapien hendrerit sollicitudin. Donec ut erat et orci accumsan lacinia ac et elit. Praesent vel felis massa. Mauris magna ante, vestibulum quis metus sit amet, volutpat mollis ex. Nullam accumsan, odio id iaculis consectetur, dui nunc hendrerit augue, non hendrerit lectus enim non lectus. Cras accumsan dui felis. Pellentesque sed dolor nec massa vehicula elementum vitae quis tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 12 | 13 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse potenti. Morbi id odio consectetur, suscipit libero id, condimentum ligula. Fusce blandit luctus orci, efficitur posuere arcu malesuada vitae. Aliquam ullamcorper velit a interdum porttitor. Suspendisse eget aliquam elit. Aliquam tempus sem sed eros rhoncus, vitae lacinia ipsum eleifend. Ut convallis fringilla nibh ut hendrerit. Aliquam erat volutpat. Cras lacinia ornare mi, et sollicitudin ante imperdiet vel. Suspendisse pharetra aliquam enim, imperdiet aliquam dui scelerisque non. Integer pretium faucibus faucibus. 14 | 15 | Nunc magna felis, rutrum at nunc eget, condimentum sagittis felis. Praesent condimentum accumsan magna accumsan tristique. Ut ullamcorper lacus nisi, sed lacinia nibh varius nec. Vestibulum consequat ornare turpis, in ultrices tortor congue vel. Ut eleifend enim in sollicitudin vulputate. Maecenas euismod ut felis vitae vulputate. Duis ullamcorper risus at elementum pharetra. Aliquam maximus commodo erat varius porttitor. Aliquam vel tristique orci, eu dapibus quam. Etiam et sapien imperdiet nulla maximus condimentum eget sed nibh. Donec ultrices mauris eu lacus lacinia facilisis. Phasellus lacinia vitae velit vitae tempor. Nunc placerat consectetur hendrerit. Proin ligula purus, finibus vel viverra ac, aliquet eu nibh. Integer non eleifend metus. Nullam placerat elit et mauris feugiat, vel sagittis nulla maximus posuere. -------------------------------------------------------------------------------- /test/two_small_duplicates/aaa.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/two_small_duplicates/bbb.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/two_small_duplicates/ccc.txt: -------------------------------------------------------------------------------- 1 | This is a simple text file -------------------------------------------------------------------------------- /test/two_zero_byte_files/yyy.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qarj/duplicate-file-finder/40cedcc45041b9c38f9fe306bd4127bb06a3d53f/test/two_zero_byte_files/yyy.txt -------------------------------------------------------------------------------- /test/two_zero_byte_files/zzz.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qarj/duplicate-file-finder/40cedcc45041b9c38f9fe306bd4127bb06a3d53f/test/two_zero_byte_files/zzz.txt -------------------------------------------------------------------------------- /test_dff.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import os 3 | import shutil 4 | import stat 5 | import unittest 6 | 7 | from stat import S_IREAD, S_IRGRP, S_IROTH 8 | 9 | from dff import ( 10 | clear_globals_for_unittests, 11 | dff, 12 | set_delete_shorter, 13 | set_output_immediately, 14 | set_trial_delete, 15 | set_verbose_output, 16 | ) 17 | 18 | version = "0.10.0" 19 | 20 | 21 | # self.assertTrue(exp) 22 | # self.assertEqual(a,b) 23 | # self.assertContains(response, 'must supply test_name') 24 | # self.assertRegex(response.content.decode('utf-8'), 'Test Passed: True') 25 | # self.assertNotRegex(response.content.decode('utf-8'), 'delete id test') 26 | 27 | 28 | def one_time_setup(): 29 | set_verbose_output(True) 30 | set_output_immediately(False) 31 | set_trial_delete(True) 32 | set_delete_shorter(False) 33 | 34 | 35 | class Testdff(unittest.TestCase): 36 | def setUp(self): 37 | clear_globals_for_unittests() 38 | pass 39 | 40 | def tearDown(self): 41 | pass 42 | 43 | def test_verbose_output_enabled(self): 44 | response = dff("test/one_file") 45 | self.assertRegex(response, "Checking size of file") 46 | 47 | def test_find_small_file_duplicate(self): 48 | response = dff("test/one_small_duplicate") 49 | self.assertRegex(response, "calculating hash snippet") 50 | self.assertRegex(response, "bbb.txt\n is dupe of test.one_small_duplicate.aaa.txt") 51 | 52 | def test_find_two_small_file_duplicates(self): 53 | response = dff("test/two_small_duplicates") 54 | self.assertRegex(response, "bbb.txt\n is dupe of test.two_small_duplicates.aaa.txt") 55 | self.assertRegex(response, "ccc.txt\n is dupe of test.two_small_duplicates.aaa.txt") 56 | self.assertNotRegex(response, "aaa.txt\n is dupe of") 57 | 58 | def test_find_large_file_duplicate(self): 59 | response = dff("test/one_large_duplicate") 60 | self.assertRegex(response, "big bbb.txt\n is dupe of test.one_large_duplicate.big aaa.txt") 61 | self.assertRegex(response, "calculating full hash") 62 | self.assertNotRegex(response, "big aaa.txt\n is dupe") 63 | 64 | def test_find_two_large_file_duplicates(self): 65 | response = dff("test/two_large_duplicates") 66 | self.assertRegex(response, "big bbb.txt\n is dupe of test.two_large_duplicates.big aaa.txt") 67 | self.assertRegex(response, "big ccc.txt\n is dupe of test.two_large_duplicates.big aaa.txt") 68 | self.assertNotRegex(response, "big aaa.txt\n is dupe") 69 | 70 | def test_do_not_find_large_file_almost_duplicate(self): 71 | response = dff("test/one_large_almost_duplicate") 72 | self.assertNotRegex(response, "is dupe of") 73 | self.assertRegex(response, "but files are different") 74 | 75 | def test_do_not_find_many_large_files_almost_duplicate(self): 76 | response = dff("test/many_large_almost_duplicate") 77 | self.assertNotRegex(response, "is dupe of") 78 | self.assertRegex(response, "but files are different") 79 | 80 | def test_search_sub_folders(self): 81 | response = dff("test") 82 | self.assertRegex(response, "is dupe of") 83 | self.assertRegex(response, "but files are different") 84 | 85 | def test_duplicate_across_folders(self): 86 | response = dff("test/duplicate_across_folders") 87 | self.assertRegex(response, "sub1.dupe.txt\n is dupe of test.duplicate_across_folders.master.txt") 88 | self.assertRegex(response, "sub1.supersub.also_dupe.txt\n is dupe of test.duplicate_across_folders.master.txt") 89 | self.assertRegex(response, "sub2.dupe.txt\n is dupe of test.duplicate_across_folders.master.txt") 90 | 91 | def test_show_count_of_duplicates(self): 92 | response = dff("test/duplicate_across_folders") 93 | self.assertRegex(response, "3 duplicate files found") 94 | 95 | def test_show_megabytes_scanned(self): 96 | response = dff("test/duplicate_across_folders") 97 | self.assertRegex(response, "0.046875 megabytes scanned") 98 | 99 | def test_delete_duplicates_trial(self): 100 | response = dff("test/duplicate_across_folders", True) 101 | self.assertRegex(response, "deleted ... test.duplicate_across_folders.sub1.dupe.txt") 102 | self.assertRegex(response, "deleted ... test.duplicate_across_folders.sub1.supersub.also_dupe.txt") 103 | self.assertRegex(response, "deleted ... test.duplicate_across_folders.sub2.dupe.txt") 104 | 105 | def test_count_of_examined_files(self): 106 | response = dff("test/duplicate_across_folders") 107 | self.assertRegex(response, "4 files and") 108 | 109 | def test_delete_read_only_file(self): 110 | try: 111 | os.chmod("test/delete_unit_test/bbb.txt", stat.S_IWRITE) 112 | except FileNotFoundError: 113 | pass 114 | # Why is this so unreliable ??? 115 | shutil.rmtree("test/delete_unit_test", ignore_errors=True) 116 | shutil.rmtree("test/delete_unit_test", ignore_errors=True) 117 | shutil.rmtree("test/delete_unit_test", ignore_errors=True) 118 | try: 119 | shutil.copytree("test/one_small_duplicate", "test/delete_unit_test") 120 | except PermissionError: 121 | print("Got some really wierd permission error - try again") 122 | shutil.copytree("test/one_small_duplicate", "test/delete_unit_test") 123 | os.chmod("test/delete_unit_test/bbb.txt", S_IREAD | S_IRGRP | S_IROTH) 124 | set_trial_delete(False) 125 | response = dff("test/delete_unit_test", True) 126 | set_trial_delete(True) 127 | self.assertRegex(response, "deleted ... test.delete_unit_test.bbb.txt") 128 | 129 | def test_show_start_and_end_times(self): 130 | response = dff("test/duplicate_across_folders") 131 | self.assertRegex(response, r"\d{2}:\d{2}:\d{2}") 132 | 133 | def test_show_run_time_in_seconds(self): 134 | response = dff("test/duplicate_across_folders") 135 | self.assertRegex(response, r"in \d+\.\d+ seconds") 136 | 137 | def test_delete_file_with_longest_name(self): 138 | shutil.rmtree("test/delete_filename_length", ignore_errors=True) 139 | shutil.rmtree("test/delete_filename_length", ignore_errors=True) 140 | shutil.rmtree("test/delete_filename_length", ignore_errors=True) 141 | shutil.copytree("test/filename_length", "test/delete_filename_length") 142 | set_delete_shorter(True) 143 | set_trial_delete(False) 144 | response = dff("test/delete_filename_length", True) 145 | set_delete_shorter(False) 146 | set_trial_delete(True) 147 | self.assertRegex(response, "deleted ... test.delete_filename_length.bbbb.txt") 148 | self.assertRegex(response, "deleted ... test.delete_filename_length.cc.txt") 149 | self.assertRegex(response, "aaaaaa.txt ... deleted") 150 | self.assertRegex(response, "deleted ... test.delete_filename_length.ee.txt") 151 | self.assertRegex(response, "aaaaaa.txt ... already deleted") 152 | self.assertRegex(response, "failed to delete 1 duplicates - rerun script") 153 | 154 | def test_do_not_process_file_of_unique_byte_size(self): 155 | response = dff("test/different_file_sizes") 156 | self.assertNotRegex(response, "Processing file") 157 | 158 | def test_files_with_non_unique_file_size_added_to_process_list(self): 159 | response = dff("test/one_large_almost_duplicate") 160 | self.assertRegex(response, "big bbb.txt added to process list") 161 | self.assertRegex(response, "big aaa.txt added to process list") 162 | self.assertRegex(response, "has non unique") 163 | 164 | def test_known_duplicates_not_added_to_list_multiple_times(self): 165 | response = dff("test/two_small_duplicates") 166 | self.assertRegex(response, "aaa.txt is a known size duplicate") 167 | self.assertRegex(response, "aaa.txt added to process list") 168 | self.assertRegex(response, "bbb.txt added to process list") 169 | self.assertRegex(response, "ccc.txt added to process list") 170 | 171 | def test_ignore_zero_byte_files(self): 172 | response = dff("test/two_zero_byte_files") 173 | self.assertNotRegex(response, "Processing file") 174 | self.assertNotRegex(response, "is dupe of") 175 | 176 | 177 | if __name__ == "__main__": 178 | one_time_setup() 179 | unittest.main() 180 | --------------------------------------------------------------------------------