view python/lsex.py @ 168:09c748a71b1b

handle overlapping files
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 26 Sep 2011 16:33:02 -0700
parents 71576cdc28ab
children 77e7cab3e9f2
line wrap: on
line source

#!/usr/bin/env python
import os
import sys
from optparse import OptionParser

# make sure duplicate path elements aren't printed twice
def ordered_set(alist):
    seen = set()
    new = []
    for item in alist:
        if item in seen:
            continue
        seen.add(item)
        new.append(item)
    return new

def lsex(path=None):
    """
    list executable files on the path
    - path: list of directories to search.  if not specified, use system path
    """

    if path is None:
        # use system path
        path = ordered_set(os.environ['PATH'].split(':'))

    executables = []

    # add the executable files to the list
    for i in path:
        if not os.path.isdir(i):
            continue
        files = [ os.path.join(i,j) for j in os.listdir(i) ]
        files = filter(lambda x: os.access(x, os.X_OK), files)
        files.sort() # just to make the output pretty
        executables.extend(files)
    return executables

def executable_names(path=None):
    executables = lsex(path)
    executables = set([os.path.basename(i) for i in executables])
    return executables

if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option('--names', action='store_true', default=False,
                      help="list only the set of names")

    options, args = parser.parse_args()
    if options.names:
        for i in sorted(executable_names()):
            print i
        sys.exit(0)
    
    for i in lsex():
        print i