| 8 | 1 import gzip | 
|  | 2 import optparse  # using optparse as hydra still python 2.6 | 
|  | 3 import os.path | 
|  | 4 import shutil | 
|  | 5 import sys | 
|  | 6 | 
|  | 7 def report_error(*args): | 
|  | 8     sys.stderr.write(' '.join(map(str,args)) + '\n') | 
|  | 9     sys.stderr.flush() | 
|  | 10     sys.exit(1) | 
|  | 11 | 
|  | 12 | 
|  | 13 def check_pattern_get_new_name(a_file, ending, options): | 
|  | 14     if options.start: | 
|  | 15         if not(a_file.startswith(options.start)): | 
|  | 16             return None | 
|  | 17     if options.last: | 
|  | 18         if ending[0] == ".": | 
|  | 19             last = options.last + ending | 
|  | 20         else: | 
|  | 21             if options.last[-1] == ".": | 
|  | 22                 last = options.last + ending | 
|  | 23             else: | 
|  | 24                 last = options.last + "." + ending | 
|  | 25         if not(a_file.endswith(last)): | 
|  | 26             return None | 
|  | 27     if options.new_ending: | 
|  | 28         name = a_file[:-len(ending)] | 
|  | 29         if options.new_ending[0] ==".": | 
|  | 30             if name[-1] == ".": | 
|  | 31                 name = name[:-1] | 
|  | 32         return name + options.new_ending | 
|  | 33     if options.decompress: | 
|  | 34         if a_file.endswith(".gz"): | 
|  | 35             return a_file[:-3] | 
|  | 36     return a_file | 
|  | 37 | 
|  | 38 | 
|  | 39 def check_and_get_new_name(a_file, options): | 
|  | 40     for ending in options.endings: | 
|  | 41         if a_file.endswith(ending): | 
|  | 42             return check_pattern_get_new_name (a_file, ending, options) | 
|  | 43     return None | 
|  | 44 | 
|  | 45 | 
|  | 46 def link(a_file, new_name, path): | 
|  | 47     file_path = os.path.join(os.path.realpath(path), a_file) | 
|  | 48     sym_path = os.path.join(os.path.realpath("output"), new_name) | 
|  | 49     #if not(os.path.exists(sym_path)): | 
|  | 50     os.link(file_path, sym_path) | 
|  | 51 | 
|  | 52 | 
|  | 53 def decompress(a_file, new_name, path): | 
|  | 54     file_path = os.path.join(os.path.realpath(path), a_file) | 
|  | 55     target_path = os.path.join(os.path.realpath("output"), new_name) | 
|  | 56     with gzip.open(file_path, 'rb') as f_in, open(target_path, 'wb') as f_out: | 
|  | 57         shutil.copyfileobj(f_in, f_out) | 
|  | 58 | 
|  | 59 | 
|  | 60 def copy_and_link(path, options): | 
|  | 61     os.mkdir("output") | 
|  | 62     with open(options.list, 'w') as list_file: | 
|  | 63         files = os.listdir(path) | 
|  | 64         files.sort() | 
|  | 65         for a_file in files: | 
|  | 66             new_name = check_and_get_new_name(a_file, options) | 
|  | 67             if new_name: | 
|  | 68                 list_file.write(new_name) | 
|  | 69                 list_file.write("\n") | 
|  | 70                 if options.decompress: | 
|  | 71                     if a_file.endswith(".gz"): | 
|  | 72                         decompress(a_file, new_name,path) | 
|  | 73                     else: | 
|  | 74                         link(a_file, new_name, path) | 
|  | 75                 elif options.link: | 
|  | 76                     link(a_file, new_name, path) | 
|  | 77 | 
|  | 78 | 
|  | 79 if __name__ == '__main__': | 
|  | 80     parser = optparse.OptionParser() | 
|  | 81     parser.add_option("--path", action="store", type="string", | 
|  | 82                       help="Path of directory to check. ") | 
|  | 83     parser.add_option("--ending", action="append", type="string", dest="endings", | 
|  | 84                       help="Ending that can be listed and if requested linked or decompressed. ") | 
|  | 85     parser.add_option("--start", action="store", type="string", | 
|  | 86                       help="String that must be at the start of the file name ") | 
|  | 87     parser.add_option("--last", action="store", type="string", | 
|  | 88                       help="String that must be the last bit of the file name before the endings") | 
|  | 89     parser.add_option("--new_ending", action="store", type="string", | 
|  | 90                       help="New ending to replace any previous ending in list and if required links or decompressions. Note: If not set decompression will auto remove the compressioned part of the ending") | 
|  | 91     #parser.add_option("--regex", action="store", type="string", | 
|  | 92     #                  help="Regex pattern the file name (less . ending) must match before the endings") | 
|  | 93     parser.add_option("--list", action="store", type="string", | 
|  | 94                       help="Path to where all files should be listed. ") | 
|  | 95     parser.add_option("--link", action="store_true", default=False, | 
|  | 96                       help="If set will cause links to be added in output directory. ") | 
|  | 97     parser.add_option("--decompress", action="store_true", default=False, | 
|  | 98                       help="If set will cause gz files to be decompressed or if not a supported decompression ending linked.") | 
|  | 99     (options, args) = parser.parse_args() | 
|  | 100 | 
|  | 101 | 
|  | 102     path = options.path.strip() | 
|  | 103     if path[-1] != '/': | 
|  | 104         path = path + "/" | 
|  | 105     copy_and_link(path, options) | 
|  | 106 |