From ee091bca816849b42866a387f0925b3a65578d89 Mon Sep 17 00:00:00 2001 From: zlg Date: Mon, 25 Jun 2018 22:17:41 -0700 Subject: dupekill: Skip files that can't be accessed Also included checks for dead symlinks and network links that won't resolve. Added -a, which will display all processed files. The -v flag will only output dupes, errors, and notices. --- TODO | 3 +++ dupekill | 37 +++++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..81cd368 --- /dev/null +++ b/TODO @@ -0,0 +1,3 @@ +dupekill +-------- +* Find a way to indicate which file a dupe is a copy of. diff --git a/dupekill b/dupekill index 79d5c04..19d9123 100755 --- a/dupekill +++ b/dupekill @@ -44,7 +44,7 @@ def need_to_add(filepath, datalist): return found != 1 -def dupekill(dry_run=False, recursive=False, verbose=False, path=os.getcwd()): +def dupekill(dry_run=False, recursive=False, verbose=False, all_files=False, path=os.getcwd()): if not os.path.isdir(path): print("Error: Unable to fetch directory to work with.") @@ -72,8 +72,36 @@ def dupekill(dry_run=False, recursive=False, verbose=False, path=os.getcwd()): for item in file: # Set up a few variables we'll be needing. filepath = os.path.join(root, item) - filesize = os.stat(filepath).st_size + + # Check for information. If we can't fetch any, there's likely + # a dead symlink or something else wrong. + try: + filesize = os.stat(filepath).st_size + # This occurs when the data points to something that can't be found or + # resolved. + except IOError: + if verbose: + print("NOT FOUND:", filepath) + raise + break + + # This occurs mostly with symlinks. + except OSError: + if verbose: + print("DEAD LINK:", filepath) + raise + break + deleted = False # We need this flag to determine state before adding to the list + if not os.access(filepath, os.R_OK): + if verbose: + print("NOTICE: Cannot read from", filepath) + + break + + if not os.access(filepath, os.W_OK): + if verbose: + print("NOTICE: Cannot write to", filepath) # Funny, processed_files will always equal the index of the file # in our list. :D We might not need it, though @@ -140,7 +168,7 @@ def dupekill(dry_run=False, recursive=False, verbose=False, path=os.getcwd()): if need_to_add(filepath, hashList) and not deleted: hashList.append([filepath, filesize]) - if verbose: + if all_files: print("FILE:", filepath) print() @@ -158,11 +186,12 @@ if __name__ == '__main__': parser.add_option("-d", "--dry", dest='dry_run', action='store_true', default=False, help="displays a list of files dupekill will delete if you run it again without this flag") parser.add_option("-r", "--recursive", dest='recursive', action='store_true', default=False, help="Recurses into all directories below the starting point") parser.add_option("-v", "--verbose", dest='verbose', action='store_true', default=False, help="Provide more detailed output") + parser.add_option("-a", "--all-files", dest='all_files', action='store_true', default=False, help="Show all processed files, not just dupes and errors") (options, args) = parser.parse_args() if args and os.path.isdir(args[0]): path = os.path.abspath(args[0]) else: path = os.getcwd() - dupekill(options.dry_run, options.recursive, options.verbose, path) + dupekill(options.dry_run, options.recursive, options.verbose, options.all_files, path) except KeyboardInterrupt: print("Aborted") -- cgit v1.2.3-70-g09d2 >zlg2-3/+15 2018-10-18Catch when an invalid list filter is passedzlg4-3/+24 2018-10-12cli: Add zero-game import/export messageszlg2-11/+18 2018-10-10Bump to 0.3beta1 for PyPIzlg1-1/+1 2018-10-10Move tests and data to dedicated directoryzlg7-10/+26 2018-10-10cli: Add "export" commandzlg2-5/+54 2018-10-10cli: Add "import" commandzlg5-1/+76 2018-10-09Bump to 0.3alpha6 for PyPIzlg1-1/+1 2018-10-09cli: Add "notes" commandzlg2-4/+74 2018-10-09update_game: ensure notes are also savedzlg1-2/+2 2018-10-09cli: add 'update' commandzlg3-20/+92 2018-10-06cli: Add "delete" commandzlg2-0/+19 2018-10-06Remove ID field from DBzlg3-38/+46 2018-10-06cli: change "Status" heading to "Progress"zlg2-36/+40 2018-09-29Bump to 0.3alpha5 for PyPIzlg1-1/+1 2018-09-29cli: Add pretty printing to 'list' commandzlg3-17/+107 2018-09-08setup.py: Bump to alpha4 for PyPIzlg1-1/+1 2018-09-08cli: add '--raw' option to list commandzlg2-9/+45 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5