home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / misc_programming / batnmore.z!p / LS.BTM < prev    next >
Text File  |  1992-11-15  |  8KB  |  222 lines

  1. *REM This batch file is Freeware, free to use and redistribute unmodified *
  2. *REM Jouni Miettunen * jon@stekt.oulu.fi * Oulu * Finland * Europe * 1992 *
  3.  
  4. REM Unixlike ls command with some new/different options. Check :info
  5. REM Timestamp: 15-Nov-1992
  6.  
  7. break on^setlocal^unalias *^unset *^if "%1"=="-?" goto info
  8.  
  9. REM set DEFAULT ls action
  10. REM Note: it has *nothing* to do w/other settings or general LS behaviour.
  11. alias DEFAULT `dir/vpabw`
  12.  
  13. iff %#==0 .or. "%@ascii[%1]" != "45" then^DEFAULT %&>&>nul^goto end^endiff
  14.  
  15. REM Study options, no error detection. False options are just ignored.
  16. REM Note: at the end of this file there's a sample how to detect false options.
  17.  
  18. :optiot
  19. set index=%@eval[%index+1]^set %@ascii[%@substr[%1,%index,1]]=1
  20. if %index lt %@eval[%@len[%1]-1] goto optiot^shift
  21.  
  22. REM All this trouble to make case matter! I must have missed something...
  23. REM Note: Mike Bessy said it's a feature, that case doesn't matter. Ok.
  24.  
  25. REM Fix irrelevant user given options.
  26. if "%[%@ascii[F]]"=="1" .and. "%[%@ascii[D]]"=="1" unset %@ascii[F] %@ascii[D]
  27.  
  28. set order=/o
  29. if "%[%@ascii[e]]"=="1" set order=%order%e
  30. if "%[%@ascii[E]]"=="1" set order=%order%-e
  31. if "%[%@ascii[t]]"=="1" set order=%order%d
  32. if "%[%@ascii[n]]"=="1" set order=%order%n
  33. if "%[%@ascii[N]]"=="1" set order=%order%-n
  34. if "%[%@ascii[T]]"=="1" set order=%order%-d
  35. if "%[%@ascii[s]]"=="1" set order=%order%s
  36. if "%[%@ascii[S]]"=="1" set order=%order%-s
  37. if "%[%@ascii[r]]"=="1" set order=%order%r
  38. if "%[%@ascii[f]]"=="1" set order=/ou
  39. set add=/vklmb
  40. if "%[%@ascii[C]]"=="1" set add=%add%w
  41. if "%[%@ascii[x]]"=="1" set add=/%@substr[%add,2]
  42. if "%[%@ascii[l]]"=="1" set add=%@substr[%add,0,%@eval[%@len[%add]-1]]t
  43. if "%[%@ascii[1]]"=="1" set add=%@substr[%add,0,%@eval[%@len[%add]-1]]1
  44. if "%[%@ascii[2]]"=="1" set add=%add%2
  45. if "%[%@ascii[4]]"=="1" set add=%add%4
  46. if "%[%@ascii[R]]"=="1" set g=global /qi
  47.  
  48. REM get current root directory for recursive listings
  49. REM echos .\%@substr[%_cwps,%@len[%_root]]
  50. set here=%_cwps
  51.  
  52. REM Special case for "historical reasons", sigh...
  53. REM Unattractive output, but I'll fix it, if anybody needs it.
  54.  
  55. REM Idea to set "command" with "options" by Mike Bessy. FOR loop works now.
  56.  
  57. iff "%[%@ascii[m]]"=="1" then
  58.     alias dir `(%x %%z in (*.*) echos %%z,` `)^`
  59.     set x=for /a-d-h-s
  60.     iff "%[%@ascii[R]]"=="1" then
  61.         alias dir `(iff exist *.* then^echo rn[.\%@substr[%@upper[%_cwps],%@len[%here]]]^%x %%z in (*.*) echos %%z,` `^endiff)`
  62. REM alias dir `(
  63. REM    iff exist *.* then
  64. REM        echo rn[.\%@substr[%@upper[%_cwps],%@len[%here]]]
  65. REM        %x %%z in (*.*) echos %%z,` `
  66. REM    endiff
  67. REM    )`
  68.     else
  69.         set g=cd .`^`
  70.     endiff
  71.     iff "%[%@ascii[a]]"=="1" then
  72.         alias global `*global /qih`
  73.         set x=for /a-d
  74.     endiff
  75.     unset/q add order atr %@ascii[a] %@ascii[D] %@ascii[F] %@ascii[R]
  76. endiff
  77.  
  78. REM here set atr=l, if needed...
  79. REM Note: Bug -> Feature: document it. For example...
  80. REM You get path relatively to current dir, when you are listing directories
  81. REM recursively above your dir level and then reach the current dir and below.
  82.  
  83. REM 1st _almost_ working version, saved here "just in case"..
  84. REM iff "%[%@ascii[R]]"=="1" then alias dir `(if exist %mix .or. isdir %mix (set sub=%@upper[%_cwps]^if isdir %mix set sub=%sub%%@upper[%mix]\^echo [.\%@substr[%sub,%@len[%here]]]^%g *dir %&))`^endiff
  85.  
  86. REM Recursive
  87. if "%[%@ascii[R]]"=="1" alias dir `(gosub deep^*dir %&)`
  88.  
  89. REM Files
  90. iff "%[%@ascii[F]]"=="1" then^set atr=/a-d-h-s^endiff
  91.  
  92. REM Directories
  93. iff "%[%@ascii[D]]"=="1" then
  94.     iff "%atr"=="" then^set atr=/ad-h-s
  95.     else^set atr=/a-h-s^endiff
  96. endiff
  97.  
  98. REM All
  99. iff "%[%@ascii[a]]"=="1" then
  100.     iff %@len[%atr] le 6 then^set atr=/a
  101.     else^set atr=%@substr[%atr,,4]^endiff
  102.     alias global `*global /qih`
  103. endiff
  104.  
  105. if "%1" != "" goto kaikki^if "%[%@ascii[m]]"=="" set mix=*.*
  106.  
  107. :work
  108. REM echo WORK:label
  109. %g dir %add%%order%%atr>&>nul %mix^if %# != 0 return^goto end
  110.  
  111. REM Tehtävä: tutki nykyistä hakemistoa, _EI_MITÄÄN_MUUTA_, gosub hoitaa loput.
  112. :deep
  113. set sub=%@upper[%_cwps]
  114. REM echo DEEP:label CWPS:"%_cwps" %@index[%_cwps,%here] "%here" :%mix
  115.  
  116. REM Note: isdir doesn't accept wildcards. Another Do-It-Yourself trick.
  117. if "%[%@ascii[F]]"=="" *dir/adb %mix | set s=%@line[con,0]
  118. if "%s"=="**EOF**" .and. not isdir %mix unset s
  119.  
  120. if "%[%@ascii[D]]"=="" .and. exist %mix set s=1
  121. if "%[%@ascii[F]]"=="" .and. isdir %mix set sub=%sub%%@upper[%mix]\
  122.  
  123. iff "%s" != "" then
  124.     iff "%@index[%sub,%here]"=="-1" then
  125.         echo [%@upper[%_cwds]]
  126.     else
  127.         echo [.\%@substr[%sub,%@len[%here]]]
  128.     endiff
  129. endiff
  130. unset s^return
  131.  
  132. REM Idea: process in given order: one dir at time, files grouped together.
  133.  
  134. REM tehtävä: 1) siirry oikeaan paikkaa 2) aseta etsittävä, _EI_MITÄÄN_MUUTA_
  135. :kaikki
  136. REM IFF-THEN-ELSE does not work like expected: re-form problem
  137. REM if 1==0 iff 1==1 then^echo ERROR^endiff (4DOS 4.01 rev D)
  138. REM echo KAIKKI:label %1
  139.  
  140. iff isdir %1 .or. "%[%@ascii[D]]"=="1" then
  141.     if "%mix" != "" gosub work
  142.     iff isdir %1 then
  143.         pushd %1
  144.         set mix=*.*
  145.     elseiff "%@index[%1,\]"=="0" then
  146.         set mix=%@substr[%1,1]
  147.     else
  148.         set mix=%mix
  149.     endiff
  150.     gosub work^popd>&nul^unset mix
  151. elseiff "%mix"=="" then
  152.     set mix=%1
  153. else
  154.     set mix=%mix;%1
  155. endiff
  156. REM echo KAIKKI:end
  157. shift^if %# != 0 goto kaikki^if "%mix"=="" goto end^goto work
  158.  
  159. :info
  160. echo Usage: %@lower[%@name[%0]] [-options] file(s) | director(y|ies) ...
  161. text
  162.  
  163. sort    -e    by extension alphab. smallest first    -E    biggest first
  164.     -n    by name      alphab. smallest first    -N    biggest first
  165.     -s    by size      alphab. smallest first    -S    biggest first
  166.     -t    by time                oldest first    -T    latest  first
  167.     -f    force unsorted
  168.     -r    reverse all
  169. output    -C    multicolumn    (name)
  170.     -l    long listing    (name size date time attributes)
  171.     -m    comma-separated list of file names
  172.     -1    1 column    (name size date time description)
  173.     -2    2 columns    (name size date time)
  174.     -4    4 columns    (name size)
  175.     -x    horizontal
  176.     -?    help
  177. select    -a    all        (also hidden and system)
  178.     -D    directories
  179.     -F    files        (no empty subdirs)
  180.     -R    recursively search subdirectories
  181. endtext Note: some options override others (eg. l - 1 - 2 - 4)
  182. goto end
  183.  
  184. REM ***************************************************************************
  185. REM Note: here starts the sample option reading routine with error detection.
  186. REM It's from an early development version and _does_not_ work like the
  187. REM current option system. But the idea's here.. if you like slow batch files.
  188.  
  189. :optiot
  190. set c=%@substr[%1,%index,1]
  191. REM remember: you can go only 15 iff's deep. Set most used options in front
  192.     iff %@ascii[%c]==%@ascii[e] then^set order=%order%e
  193. elseiff %@ascii[%c]==%@ascii[t] then^set order=%order%d
  194. elseiff %@ascii[%c]==%@ascii[L] then^set order=%order%s
  195. elseiff %@ascii[%c]==%@ascii[r] then^set order=%order%r
  196. elseiff %@ascii[%c]==%@ascii[f] then^set order=ou
  197. elseiff %@ascii[%c]==%@ascii[x] then^iff "%x"=="" then^set add=%@substr[%add,1]^set x=1^endiff
  198. elseiff %@ascii[%c]==%@ascii[R] then^set flag=up
  199. elseiff %@ascii[%c]==%@ascii[a] then^iff %arg==l then^set arg=a^else^set arg=%@substr[%arg,0,3]^endiff^alias global `*global/qh`
  200. elseiff %@ascii[%c]==%@ascii[F] then^iff %arg==l then^set arg=a-d-h-s^elseiff %@len[%arg] lt 4 then^set arg=a-d^else^set arg=a-d-h-s^endiff
  201. elseiff %@ascii[%c]==%@ascii[D] then^iff %arg==l then^set arg=ad-h-s^elseiff %@len[%arg] lt 4 then^set arg=ad^else^set arg=ad-h-s^endiff
  202. elseiff %@ascii[%c]==%@ascii[C] then^set add=%add%w
  203. elseiff %@ascii[%c]==%@ascii[m] then^set add=%add%b
  204. elseiff %@ascii[%c]==%@ascii[l] then^set add=%add%t
  205. elseiff %@ascii[%c]==%@ascii[2] then^set add=%add%2
  206. elseiff %@ascii[%c]==%@ascii[4] then^set add=%add%4
  207. else^goto error
  208. endiff
  209. set index=%@eval[%index+1]^if %index lt %@len[%1] goto optiot
  210. shift
  211.  
  212. :work
  213. ...
  214.  
  215. REM ***************************************************************************
  216. :error
  217. echo Usage: %@lower[%@name[%0]] [-aCDeEfFlmnNrRsStTx24?] file | directory ...
  218. REM ***************************************************************************
  219.  
  220. :end
  221. break off^quit
  222.