101 lines
2.1 KiB
Python
Executable File
101 lines
2.1 KiB
Python
Executable File
#!/bin/python3
|
|
|
|
import sys
|
|
import getopt
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
ARCHIVE_TYPES = [
|
|
".zip",
|
|
".rar",
|
|
".7z"
|
|
]
|
|
MAX_OUTPUT_LEN = 150
|
|
|
|
input_path = ""
|
|
do_delete = False
|
|
|
|
def usage(name):
|
|
print('''{script} [options]
|
|
-i <path> : specify input dir
|
|
-d : do delete
|
|
-h : print help and quit'''\
|
|
.format(script=name))
|
|
|
|
def opts(argv):
|
|
global input_path, do_delete
|
|
try:
|
|
opts, args = getopt.getopt(argv[1:], 'i:dh')
|
|
except getopt.GetoptError as e:
|
|
print("Unkown option. Quiting.")
|
|
exit(1)
|
|
for opt, arg in opts:
|
|
if opt == '-i':
|
|
input_path = arg
|
|
elif opt == '-d':
|
|
do_delete = True
|
|
elif opt == '-h':
|
|
usage(argv[0])
|
|
exit(0)
|
|
|
|
def is_password_protected(file):
|
|
command = ['7z', 't', '-p', file]
|
|
process = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
|
|
try:
|
|
process.wait()
|
|
except:
|
|
pass
|
|
return 0 != process.returncode
|
|
|
|
def extract(file):
|
|
if is_password_protected(file):
|
|
#print('Ignoring ', file, '.', sep='')
|
|
return
|
|
global do_delete
|
|
output_dir = str(file.parent) + '/' + str(file.stem)
|
|
try:
|
|
os.mkdir(output_dir)
|
|
except:
|
|
pass
|
|
output_option = '-o' + str(output_dir)
|
|
command = ['7z', 'x', file, output_option]
|
|
try:
|
|
print('Extracting: ', file, '... ', sep='', end='')
|
|
process = subprocess.Popen(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=subprocess.PIPE)
|
|
process.communicate(input='Y\n'.encode())
|
|
process.wait()
|
|
if process.returncode == 0:
|
|
print('Success.')
|
|
if do_delete:
|
|
os.remove(file)
|
|
else:
|
|
print('Fail.')
|
|
except:
|
|
print('\nError while forking 7z. Is it installed correctly?')
|
|
|
|
def scandir(dir_):
|
|
#print('scandir', dir_)
|
|
global MAX_OUTPUT_LEN
|
|
global ARCHIVE_TYPES
|
|
if len(str(dir_)) >= MAX_OUTPUT_LEN:
|
|
return
|
|
for entry in Path(dir_).iterdir():
|
|
if entry.is_dir():
|
|
scandir(entry)
|
|
else:
|
|
for t in ARCHIVE_TYPES:
|
|
if t == entry.suffix:
|
|
extract(entry)
|
|
|
|
def main(argv):
|
|
global input_path, do_delete
|
|
opts(argv)
|
|
if input_path == '':
|
|
print("No input directory specified. Quiting.")
|
|
exit(1)
|
|
scandir(input_path)
|
|
|
|
if __name__ == "__main__":
|
|
main(sys.argv)
|