Skip to content

Instantly share code, notes, and snippets.

@chaserhkj
Created January 1, 2020 02:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chaserhkj/db57ac0b675adc2461ca14dc62bf6a14 to your computer and use it in GitHub Desktop.
Save chaserhkj/db57ac0b675adc2461ca14dc62bf6a14 to your computer and use it in GitHub Desktop.
Renaming files with too long a filename, useful on EncFS
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