Created
January 1, 2020 02:16
-
-
Save chaserhkj/db57ac0b675adc2461ca14dc62bf6a14 to your computer and use it in GitHub Desktop.
Renaming files with too long a filename, useful on EncFS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os, sys | |
import hashlib | |
THRESHOLD = 100 | |
DRY=True | |
def main(d_path): | |
d_base = os.path.dirname(d_path) | |
d_name = os.path.basename(d_path) | |
h_path = d_path | |
if len(d_name.encode('utf8')) > THRESHOLD: | |
h_name = hashlib.sha1(d_name.encode('utf8')).hexdigest() | |
h_path = os.path.join(d_base, h_name) | |
if rename(d_path, h_path): | |
with open(os.path.join(h_path, 'dir.name'), 'w') as f: | |
f.write(d_name) | |
else: | |
h_path = d_path | |
ensure_file_length(h_path) | |
def ensure_file_length(base): | |
for file_name in os.listdir(base): | |
new_name = file_name | |
if len(new_name.encode('utf8')) > THRESHOLD: | |
_, ext = os.path.splitext(new_name) | |
new_name = hashlib.sha1(new_name.encode('utf8')).hexdigest() + ext | |
if rename(os.path.join(base, file_name), os.path.join(base, new_name)): | |
with open(os.path.join(base, new_name + '.name'), 'w') as f: | |
f.write(file_name) | |
else: | |
new_name = file_name | |
if os.path.isdir(os.path.join(base, new_name)): | |
ensure_file_length(os.path.join(base, new_name)) | |
def rename(src, dst): | |
print(src + '->' + dst) | |
if not DRY: | |
os.rename(src, dst) | |
return True | |
return False | |
if __name__ == '__main__': | |
if sys.argv[1] == '-f': | |
DRY=False | |
main(sys.argv[2]) | |
else: | |
main(sys.argv[1]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment