Guest User

Untitled

a guest
Feb 21st, 2018
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.21 KB | None | 0 0
  1. # Shell script for automatically creating file collections
  2. # initally written to reduce the number of games when downloading
  3. # retropie rom collections
  4.  
  5. #!/bin/bash
  6. version="0.3.1"
  7.  
  8. collection=()
  9. collectionname=""
  10. collsize=0
  11. count=1
  12. breakchars=("(" "." "," ")" "[" "]")
  13.  
  14. silent=0
  15. verbose=0
  16. case=1
  17. format=".*"
  18. dirs=0
  19. minLength=1
  20. minSize=2
  21. prefix=""
  22. postfix=""
  23. parentDir=""
  24. excludes=""
  25.  
  26. version()
  27. {
  28. echo "Autocollection tool by Aram Becker - Version $version"
  29. }
  30.  
  31. usage()
  32. {
  33. version
  34. echo "Usage: autocollection [OPTION]... [DIRECTORY]"
  35. echo
  36. echo "Option -c | --create-dirs must be set to actually collect files, if not set collections are only displayed, not created"
  37. echo
  38. echo "Options:"
  39. echo
  40. echo "-V, --version display version and exit"
  41. echo "-h, --help display this help page and exit"
  42. echo "-f, --format FORMAT set file ending of files to autocollect (e.g. '.nes')"
  43. echo "-c, --create-dirs actually create directories"
  44. echo "-s, --silent don't display collections"
  45. echo "-v, --verbose display all files put into collections"
  46. echo " --prefix PREFIX prefix all collections with given value"
  47. echo " --postfix POSTFIX append all collections with given value"
  48. echo " --min-name-length INT minimum name length of collection"
  49. echo " --min-coll-size INT minimum collection size to be created"
  50. echo "-e, --exclue exclude specific collection names (e.g. 'super,space') to prevent too large collections, comma seperated"
  51. echo "-i, --case-insensitive collect file names without caring about case (e.g. 'Game' and 'game')"
  52. echo "-r, --revert move all games out of their collections back into the folder"
  53. echo "-a, --sort-alphabet Create alphabetical collections"
  54. }
  55.  
  56. alphabeticFolders()
  57. {
  58. alphabet=("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z")
  59. for c in ${alphabet[@]}
  60. do
  61. files=()
  62. count=0
  63. for f in $c*
  64. do
  65. if [ "$f" != "$c*" ] && [ "$f" != "$c" ]
  66. then
  67. files[${#files[@]}]="${f##*/}"
  68. ((count++))
  69. fi
  70. done
  71. for f in ${c,,}*
  72. do
  73. if [ "$f" != "${c,,}*" ]
  74. then
  75. files[${#files[@]}]="${f##*/}"
  76. ((count++))
  77. fi
  78. done
  79. if [ ${#files[@]} -gt 0 ]
  80. then
  81. if [ $silent -lt 1 ]
  82. then
  83. echo "Creating directory for $c..."
  84. fi
  85. mkdir "$c"
  86. for (( i=0; i<$count; i++ ))
  87. do
  88. if [ $verbose -gt 0 ]
  89. then
  90. echo "Moving ${files[i]}..."
  91. fi
  92. mv "${files[i]}" "$c"
  93. done
  94. fi
  95. done
  96. }
  97.  
  98. isBreakChar()
  99. {
  100. retval=0
  101. if [ "$1" = "" ] || [ "$1" = " " ]
  102. then
  103. retval=1
  104. else
  105. for c in ${breakchars[@]}
  106. do
  107. if [ "$1" = "$c" ]
  108. then
  109. retval=1
  110. break
  111. fi
  112. done
  113. fi
  114. echo $retval
  115. }
  116.  
  117. checkExcluded()
  118. {
  119. retval=0
  120. for key in "${excludes[@]}"
  121. do
  122. if [ "${1,,}" = "${excludes[$key]}" ]
  123. then
  124. retval=1
  125. break
  126. fi
  127. done
  128. echo $retval
  129. }
  130.  
  131. saveCollection()
  132. {
  133. paren_open=0
  134. for (( i=0; i<${#collectionname}; i++ ))
  135. do
  136. c="${collectionname:$i:1}"
  137. if [ "$c" = "(" ]
  138. then
  139. paren_open=$i
  140. fi
  141. if [ "$c" = ")" ]
  142. then
  143. paren_open=0
  144. fi
  145. done
  146.  
  147. if [ $paren_open -gt 1 ]
  148. then
  149. collectionname="${collectionname:0:paren_open}"
  150. fi
  151. while [ "${collectionname:((${#collectionname}-1)):1}" = " " ] || [ "${collectionname:((${#collectionname}-1)):1}" = "-" ]
  152. do
  153. collectionname="${collectionname:0:((${#collectionname}-1))}"
  154. done
  155. if [ $case -lt 1 ]
  156. then
  157. collectionname=($collectionname)
  158. collectionname="${collectionname[@]^}"
  159. fi
  160. collectionname="$prefix$collectionname$postfix"
  161. if [ $silent -lt 1 ]
  162. then
  163. echo Creating collection \"$collectionname\" with $collsize entries...
  164. if [ $verbose -gt 0 ]
  165. then
  166. echo "Entries: ${collection[0]}"
  167. for (( j=1; j<$collsize; j++ ))
  168. do
  169. echo " ${collection[j]}"
  170. done
  171. fi
  172. fi
  173. if [ $dirs -gt 0 ]
  174. then
  175. mkdir "$collectionname"
  176. for (( j=0; j<$collsize; j++ ))
  177. do
  178. mv "${collection[j]}" "$collectionname"
  179. done
  180. fi
  181. }
  182.  
  183. createCollections()
  184. {
  185. for f in *$format
  186. do
  187. fn="${f##*/}"
  188. if [ $case -lt 1 ]
  189. then
  190. fn="${fn,,}"
  191. fi
  192. if [ $collsize -lt 1 ]
  193. then
  194. collectionname="$fn"
  195. collection[0]="${f##*/}"
  196. collsize=1
  197. else
  198. for ((i=0; i<${#fn}; i++))
  199. do
  200. if [ "${fn:$i:1}" = "${collectionname:$i:1}" ]
  201. then
  202. :
  203. else
  204. fulltitle=$(isBreakChar ${fn:((i-1)):1})
  205. if [ "$excludes" = "" ]
  206. then
  207. isExluded=0
  208. else
  209. tempcollname="${fn:0:$i}"
  210. paren_open=0
  211. for (( i=0; i<${#tempcollname}; i++ ))
  212. do
  213. c="${tempcollname:$i:1}"
  214. if [ "$c" = "(" ]
  215. then
  216. paren_open=$i
  217. fi
  218. if [ "$c" = ")" ]
  219. then
  220. paren_open=0
  221. fi
  222. done
  223. if [ $paren_open -gt 1 ]
  224. then
  225. tempcollname="${tempcollname:0:paren_open}"
  226. fi
  227. while [ "${tempcollname:((${#tempcollname}-1)):1}" = " " ] || [ "${tempcollname:((${#tempcollname}-1)):1}" = "-" ]
  228. do
  229. tempcollname="${tempcollname:0:((${#tempcollname}-1))}"
  230. done
  231. isExluded=$(checkExcluded $tempcollname)
  232. fi
  233. if [ $i -gt $minLength ] && [ $fulltitle -gt 0 ] && [ $isExluded -lt 1 ]
  234. then
  235. collectionname="${fn:0:$i}"
  236. collection[$collsize]="${f##*/}"
  237. ((collsize++))
  238. else
  239. if [ $collsize -ge $minSize ]
  240. then
  241. saveCollection
  242. fi
  243. collection=()
  244. collectionname="$fn"
  245. collection[0]="${f##*/}"
  246. collsize=1
  247. fi
  248. break
  249. fi
  250. done
  251. fi
  252. ((count++))
  253. echo -ne Processed $count files...\\r
  254. done
  255.  
  256. if [ $collsize -gt $minSize ]
  257. then
  258. saveCollection
  259. fi
  260. }
  261.  
  262. revert()
  263. {
  264. for dir in */
  265. do
  266. if [ $silent -lt 1 ]
  267. then
  268. echo Unpacking collection ${dir::-1}...
  269. if [ $verbose -gt 0 ]
  270. then
  271. firstline=1
  272. for f in "$dir"/*
  273. do
  274. if [ $firstline -gt 0 ]
  275. then
  276. echo "Entries: ${f##*/}"
  277. firstline=0
  278. else
  279. echo " ${f##*/}"
  280. fi
  281. done
  282. fi
  283. fi
  284. mv "$dir"* .
  285. rm "$dir" -R
  286. done
  287. }
  288.  
  289. doRevert=0
  290. doAlphabetical=0
  291. while [ "$1" != "" ]; do
  292. case $1 in
  293. -h | --help ) usage
  294. exit
  295. ;;
  296. -V | --version ) version
  297. exit
  298. ;;
  299. -f | --format ) shift
  300. format=$1
  301. ;;
  302. -c | --create-dirs ) dirs=1
  303. ;;
  304. -s | --silent ) silent=1
  305. ;;
  306. -v | --verbose ) verbose=1
  307. ;;
  308. --prefix ) shift
  309. prefix=$1
  310. ;;
  311. --postfix ) shift
  312. postfix=$1
  313. ;;
  314. --min-name-length ) shift
  315. minLength=$1
  316. ;;
  317. --min-coll-size ) shift
  318. minSize=$1
  319. ;;
  320. -e | --exclude ) shift
  321. IFS=,
  322. excludes=(${1,,})
  323. ;;
  324. -i | --case-insensitive ) case=0
  325. ;;
  326. -r | --revert ) doRevert=1
  327. ;;
  328. -a | --sort-alphabet ) doAlphabetical=1
  329. ;;
  330. * ) if [ "$parentDir" = "" ]
  331. then
  332. parentDir=$1
  333. else
  334. usage
  335. exit 1
  336. fi
  337. esac
  338. shift
  339. done
  340.  
  341. cd "$parentDir"
  342. version
  343. if [ $doRevert -gt 0 ]
  344. then
  345. echo "reverting collections in $PWD..."
  346. revert
  347. exit
  348. fi
  349. if [ $doAlphabetical -gt 0 ]
  350. then
  351. echo "Creating alphabetical collections in $PWD..."
  352. alphabeticFolders
  353. exit
  354. fi
  355. echo "Creating collections in $PWD..."
  356. echo
  357. createCollections
  358. echo
Add Comment
Please, Sign In to add comment