#!/bin/bash -e # last updated 2025-01-29 by mza # find -printf: # %u = user # %g = group # %M = rwxr-x--- # %s = size # %p = name # %l = target of symlink # %TY-%Tm-%Td+%TH:%TM = modification datestamp declare DATESTAMP='%TY-%Tm-%Td+%TH:%TM' declare USERGROUP='%7u:%-7g' declare PERMISSIONS='%M' declare SIZE='%12s' #declare REGULAR_FILE_STRING=$DATESTAMP' '$USERGROUP' '$PERMISSIONS' '$SIZE' %p\n' declare BASE="$DATESTAMP $SIZE %p" declare REGULAR_FILE_STRING="" declare REGULAR_DIR_STRING="" declare SYMLINK_STRING="" declare SORT_STRING="" # defaults: declare -i showdir=0 declare -i showsymlink=0 declare -i showusergroup=0 declare -i showpermissions=0 declare -i shouldsort=1 if [ $# -gt 0 ]; then for each; do if [ "${each:0:1}" == "-" ]; then if [ "${each}" != "${each/d/}" ]; then showdir=1 fi if [ "${each}" != "${each/l/}" ]; then showsymlink=1 fi if [ "${each}" != "${each/u/}" ]; then showusergroup=1 fi if [ "${each}" != "${each/p/}" ]; then showpermissions=1 fi if [ "${each}" != "${each/s/}" ]; then shouldsort=0 fi shift else break; fi done fi if [ $showusergroup -gt 0 ]; then if [ $showpermissions -gt 0 ]; then BASE="$DATESTAMP $USERGROUP $PERMISSIONS $SIZE %p" else BASE="$DATESTAMP $USERGROUP $SIZE %p" fi elif [ $showpermissions -gt 0 ]; then BASE="$DATESTAMP $PERMISSIONS $SIZE %p" fi REGULAR_FILE_STRING="$BASE\n" if [ $showdir -gt 0 ]; then REGULAR_DIR_STRING="$BASE/\n" else REGULAR_DIR_STRING="" fi if [ $showsymlink -gt 0 ]; then SYMLINK_STRING="$BASE -> %l\n" else SYMLINK_STRING="" fi if [ $shouldsort -gt 0 ]; then SORT_STRING='sort -k1n' else SORT_STRING='cat' fi # a second -k 3 should then sort by filename to break ties, but it doesn't seem to work # page 421 of "bash Cookbook" is helpful here find "${@}" \ -type d \( -name "proc" -o -name "dev" -o -name "\.svn" -o -name "\.git" -o -name "\@eaDir" \) -prune \ -o -type d -printf "$REGULAR_DIR_STRING" \ -o -type l -printf "$SYMLINK_STRING" \ -o -printf "$REGULAR_FILE_STRING" \ | $SORT_STRING