#!/bin/sh # List the newest files in the specified paths and by default any subdirectories # If no paths are specified, the current directory is listed. # License: LGPLv2 # Author: # http://www.pixelbeat.org/ # Notes: # This script explicitly ignores repository metadata. # This script (well find actually) fails for user specified paths # that begin with '-', '(' or '!', so prepend './' for paths like that. # Changes: # V1.0, 26 May 2005, Initial release # V1.1, 20 Jul 2007, Ignore git metadata in addition to svn and cvs # Fix options syntax (breaks backwards compatibility) # Add -nr option to not recurse # Add -na option to ignore dotfiles # Add -r option to show oldest rather than newest # Allow specifying multiple files & directories # Don't output extra file info if output is not a tty global num := '"20'" proc usage { echo "Usage: $[basename $0] [-nr] [-na] [-n#] [-s] [-r] [path...]" > !2 echo > !2 echo " -nr do not recurse" > !2 echo " -na ignore files starting with ." > !2 echo " -n# list the newest # files ($num by default)" > !2 echo " -r reverse to show oldest files" > !2 exit 1 } global num := ""-n$num"" global dotfiles := '"yes'" global recurse := '"yes'" global reverse := ''"" while : { matchstr $1 { -- { shift; break } -na { global dotfiles := '"no'" } -nr { global recurse := '"no'" } -n[0-9]* { global num := $1 } -r { global reverse := '"r'" } --help { usage } --version { echo "1.1" && exit } * { break } } shift } test $dotfiles = "no" && global ignore_hidden := '"-name '.*' -o'" test $recurse = "no" && global dont_recurse := '"-maxdepth 1'" if test $Argc -gt 0 { global path_format := '"%p'" } else { global path_format := '"%P'" set -- "./" } global ignore_metadata := '"\( -type d -a \( -name '.git' -o -name '.svn' -o -name 'CVS' \) \) -prune -o'" global print_format := ""\( -type f -printf '%T@\t$path_format\n' "\)" eval find '"$@"' $dont_recurse $ignore_metadata $ignore_hidden $print_format | sort -k1,1$(reverse)n | tail $num | cut -f2- | if test ! -p /proc/self/fd/1 { tr '\n' '\0' | xargs -r0 ls -lUd --color=auto -- } else { cat } (CommandList children: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:num) op:Equal rhs:{(DQ (20))} spids:[60])] spids: [60] ) (FuncDef name: usage body: (BraceGroup children: [ (SimpleCommand words: [ {(echo)} { (DQ ("Usage: ") (CommandSubPart command_list: (CommandList children:[(C {(basename)} {($ VSub_Number "$0")})]) left_token: spids: [77 81] ) (" [-nr] [-na] [-n#] [-s] [-r] [path...]") ) } ] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[85])] ) (SimpleCommand words: [{(echo)}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[91])] ) (SimpleCommand words: [{(echo)} {(DQ (" -nr do not recurse"))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[101])] ) (SimpleCommand words: [{(echo)} {(DQ (" -na ignore files starting with ."))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[111])] ) (SimpleCommand words: [ {(echo)} {(DQ (" -n# list the newest # files (") ($ VSub_Name "$num") (" by default)"))} ] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[123])] ) (SimpleCommand words: [{(echo)} {(DQ (" -r reverse to show oldest files"))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[133])] ) (C {(exit)} {(1)}) ] spids: [70] ) spids: [66 69] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:num) op: Equal rhs: {(DQ (-n) ($ VSub_Name "$num"))} spids: [144] ) ] spids: [144] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:dotfiles) op:Equal rhs:{(DQ (yes))} spids:[150])] spids: [150] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:recurse) op:Equal rhs:{(DQ (yes))} spids:[155])] spids: [155] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:reverse) op:Equal rhs:{(DQ )} spids:[160])] spids: [160] ) (While cond: [(C {(Lit_Other ":")})] body: (DoGroup children: [ (Case to_match: {(DQ ($ VSub_Number "$1"))} arms: [ (case_arm pat_list: [{(--)}] action: [ (Sentence child:(C {(shift)}) terminator:) (ControlFlow token:) ] spids: [180 181 188 -1] ) (case_arm pat_list: [{(-na)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:dotfiles) op: Equal rhs: {(DQ (no))} spids: [194] ) ] spids: [194] ) ] spids: [191 192 199 -1] ) (case_arm pat_list: [{(-nr)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:recurse) op: Equal rhs: {(DQ (no))} spids: [205] ) ] spids: [205] ) ] spids: [202 203 210 -1] ) (case_arm pat_list: [{(-n) (Lit_Other "[") (0-9) (Lit_Other "]") (Lit_Other "*")}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:num) op: Equal rhs: {($ VSub_Number "$1")} spids: [220] ) ] spids: [220] ) ] spids: [213 218 223 -1] ) (case_arm pat_list: [{(-r)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:reverse) op: Equal rhs: {(DQ (r))} spids: [229] ) ] spids: [229] ) ] spids: [226 227 234 -1] ) (case_arm pat_list: [{(--help)}] action: [(C {(usage)})] spids: [237 238 242 -1] ) (case_arm pat_list: [{(--version)}] action: [(AndOr children:[(C {(echo)} {(DQ (1.1))})(C {(exit)})] op_id:Op_DAmp)] spids: [245 246 258 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [(ControlFlow token:)] spids: [261 262 266 -1] ) ] spids: [171 177 269] ) (C {(shift)}) ] spids: [168 274] ) ) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$dotfiles"))} {(Lit_Other "=")} {(DQ (no))} {(Lit_Other "]")} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:ignore_hidden) op: Equal rhs: {(DQ ("-name '.*' -o"))} spids: [292] ) ] spids: [292] ) ] op_id: Op_DAmp ) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$recurse"))} {(Lit_Other "=")} {(DQ (no))} {(Lit_Other "]")} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:dont_recurse) op: Equal rhs: {(DQ ("-maxdepth 1"))} spids: [313] ) ] spids: [313] ) ] op_id: Op_DAmp ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {($ VSub_Pound "$#")} {(-gt)} {(0)} {(Lit_Other "]")}) terminator: ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:path_format) op: Equal rhs: {(DQ ("%p"))} spids: [334] ) ] spids: [334] ) ] spids: [-1 331] ) ] else_action: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:path_format) op:Equal rhs:{(DQ ("%P"))} spids:[342])] spids: [342] ) (C {(set)} {(--)} {(DQ (./))}) ] spids: [339 356] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:ignore_metadata) op: Equal rhs: { (DQ (EscapedLiteralPart token:) (" -type d -a ") (EscapedLiteralPart token:) (" -name '.git' -o -name '.svn' -o -name 'CVS' ") (EscapedLiteralPart token:) (" ") (EscapedLiteralPart token:) (" -prune -o") ) } spids: [359] ) ] spids: [359] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:print_format) op: Equal rhs: { (DQ (EscapedLiteralPart token:) (" -type f -printf '%T@") (EscapedLiteralPart token:) ($ VSub_Name "$path_format") (EscapedLiteralPart token:) ("' ") (EscapedLiteralPart token:) ) } spids: [371] ) ] spids: [371] ) (Pipeline children: [ (C {(eval)} {(find)} {(SQ <"\"$@\"">)} {($ VSub_Name "$dont_recurse")} {($ VSub_Name "$ignore_metadata")} {($ VSub_Name "$ignore_hidden")} {($ VSub_Name "$print_format")} ) (C {(sort)} {(-k1) (Lit_Comma ",") (1) (${ VSub_Name reverse) (n)}) (C {(tail)} {($ VSub_Name "$num")}) (C {(cut)} {(-f2-)}) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {(KW_Bang "!")} {(-p)} {(/proc/self/fd/1)} {(Lit_Other "]")}) terminator: ) ] action: [ (Pipeline children: [ (C {(tr)} {(SQ <"\\n">)} {(SQ <"\\0">)}) (C {(xargs)} {(-r0)} {(ls)} {(-lUd)} {(--color) (Lit_Other "=") (auto)} {(--)}) ] negated: False ) ] spids: [-1 437] ) ] else_action: [(C {(cat)})] spids: [467 472] ) ] negated: False ) ] )