find_broken_link.py

# ===================================================================
# From: www.linux-magazine.com/Issues/2022/261/
#       Tutorial-Detecting-Broken-Links
#
# First, the program creates and validates a directory listing.
# In case of an error, the walk() function terminates here.
# Then the code checks each entry in the directory to see if it is
# a file (line 11), a directory, or a link. The routine skips files.
# For directories, the walk() function is called recursively, again
# with the directory name as parameter.
#
# For a link, however, the readlink() function from the os module
# in line finds the target. If it is empty, it is a broken link,
# and the function returns an error message to that effect. After
# checking all the entries in the directory, the function returns
# to the call point.
# ===================================================================
# This creates a symbolic link dst to src
# import os
# src = '/usr/bin/python'
# dst = '/tmp/python'
# os.symlink(src, dst)
# print('symlink created')
# ===================================================================

import os,sys

# ---- walk a directory tree

def walk(top):
    try:
        entries = os.listdir(top)
    except os.error:
        return

    for name in entries:
        path = os.path.join(top, name)
        if os.path.isfile(path):
           pass
        if os.path.isdir(path):
            walk(path)
        if os.path.islink(path):
            destination = os.readlink(path)
            if not os.path.exists(path):
                print(f'broken link: from {path} points to {destination}')
    return

# ---- main

startingDir = sys.argv[1]
walk(startingDir)