Fred Stluka on 16 Nov 2018 07:59:06 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] scripting help, variables in sed |
Brent, Nice answer! Considered, thoughtful, detailed, accurate. I like it! It's a shame we don't have a mechanism in the PLUG list for StackOverflow-style ratings for good answers and helpful contributors. I'd give you a "thumbs up"! --Fred ------------------------------------------------------------------------ Fred Stluka -- Bristle Software, Inc. -- http://bristle.com #DontBeATrump -- Make America Honorable Again! ------------------------------------------------------------------------ On 11/16/18 10:30 AM, brent timothy saner wrote:
On 11/16/18 10:02 AM, Michael Lazin wrote:Thank you, I am very familiar with find and exec, but this doesn't accomplish my goal. Maybe I wasn't clear. I want a number to be added in front of each file name and that number to be incremented by one so each file ends up with a unique name so they can be put together in a single folder. I was under the impression that sed -i would accomplish this, but maybe I'm doing this entirely wrong, I want to edit the filename and not the content. I am sorry, I am comfortable with bash but I am at best a noob programmer. Thanks.ah, yes, i thought you were only interested in moving to a single directory as that's the only thing explicitly mentioned. so sure, if you want to do that: __________________________________________ num=0 for f in $(find * -type f -name "*.jpg"); do mv ${f} ${num}${f} ((num++)) done __________________________________________ but that's a bit silly, that. they're already going to have a unique filename if you're pulling them all from the same source directory. the below not only guarantees a unique filename per unique file content (MOSTLY[0]), but would have completely removed your need to run fdupes: __________________________________________ for f in $(find * -type f -name "*.jpg"); do newfname=$(md5sum ${f} | awk '{print $1".jpg"}') mv ${f} newdir/${newfname} done __________________________________________ but again, this all predicates on you (pointlessly) running this on a glob search against files which are all in the same directory. if they're in subdirs, it's a little more comfortable to deal with in python: __________________________________________ #!/usr/bin/env python3 import os import hashlib #cnt = 0 for root, subdirs, files in os.walk('path/to/parent/dir'): for f in files: fpath = os.path.join(root, f) if f.endswith('.jpg'): # If you want hash-based naming, which has built-in dupe avoidance: h = hashlib.md5() # can also be a stronger hash, e.g. .sha512() with open(fpath, 'rb') as data_in: h.update(f.read()) # it'd be smart to implement chunking here [1] but being that these are in theory just JPEG files... new_fpath = os.path.join(root, '{0}.jpg'.format(h.hexdigest())) # Or if you just want to use a blind counter prefix: #new_fpath = os.path.join(root, (str(cnt) + f)) #cnt += 1 # Remember to uncomment cnt = 0 above. os.rename(fpath, new_fpath) __________________________________________ ta-da. [0] https://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities using e.g. sha512sum for instance, while increasing the length of the filenames, would avoid this. you're very much unlikely to encounter it "in the wild" as a result of this particular use and scope, though. [1] https://git.square-r00t.net/OpTools/tree/centos/find_changed_confs.py#n68 ___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug
___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug