A BASH script that sorts the files that photorec recovers into folders by their file extension by Erik Popp https://github.com/erikpopp/sort-photorec
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
4.7KB

  1. #!/bin/bash
  2. usage="+-------------------------------------------------------------------------------------+
  3. | sort-photorec |
  4. | sorts the files recovered by photorec into folders by file extension |
  5. | usage: |
  6. | sort-photorec [-v|--verbose] [-q|--quiet] folder_which_contains_recup_dir.*_folders |
  7. +-------------------------------------------------------------------------------------+"
  8. #author info
  9. author_name="Erik Popp"
  10. author_website="erikpopp.com"
  11. #settings
  12. fifo_filename="/var/run/sort-photorec/$$"
  13. fifo_folder="/var/run/sort-photorec"
  14. files_without_extensions="No File Extension"
  15. sorted_files="Sorted Files"
  16. verbosity=1
  17. #logger
  18. function logger
  19. {
  20. if test -n "$1"
  21. then
  22. if test "$1" -le "$verbosity"
  23. then
  24. if test -n "$2"
  25. then
  26. echo "sort-photorec: $2" 1>&2
  27. else
  28. echo "sort-photorec: logger: you forgot to specify a log message"
  29. fi
  30. fi
  31. else
  32. echo "sort-photorec: logger: you forgot to specify a log level"
  33. fi
  34. }
  35. #make fifo and open it in file descriptor 3 so I can pipe filenames that I'm filtering while still giving feedback through stdout as expected
  36. #mkdir "$fifo_folder"
  37. #mkfifo -m 'u=rw,go=' "$fifo_filename"
  38. #process arguments
  39. for argument in $@
  40. do
  41. case "$argument" in
  42. -v|--verbose) let verbosity++
  43. logger 0 "increasing verbosity to $verbosity"
  44. ;;
  45. -q|--quiet) let verbosity--
  46. logger 0 "decreasing verbosity to $verbosity"
  47. ;;
  48. *) if test -d "$argument"
  49. then
  50. if test -z "$recovered_folder"
  51. then
  52. logger 1 "sorting recovered files in \"$1\""
  53. recovered_folder="$argument"
  54. else
  55. logger 0 "folder with recovered files already specified (\"$recovered_folder\"), refusing to set a second folder to check"
  56. echo "$usage"
  57. logger 0 "quitting..."
  58. exit
  59. fi
  60. else
  61. logger 0 "\"$argument\" is not a folder, quitting"
  62. echo "$usage"
  63. exit
  64. fi
  65. esac
  66. done
  67. if test -z "$recovered_folder"
  68. then
  69. logger 0 "you forgot to specify the folder that the recovered files are in, quitting"
  70. echo "$usage"
  71. exit
  72. fi
  73. #process files
  74. logger 1 "moving to folder with recovered files \"$recovered_folder\""
  75. pushd "$recovered_folder" 1>&2
  76. if test -d "$sorted_files"
  77. then
  78. logger 0 "folder for sorted files already exists, using it..."
  79. logger 1 "am I continuing from a previous run?"
  80. elif test ! -e "$sorted_files"
  81. then
  82. logger 1 "folder for sorted files (\"$sorted_files\") does not exist, creating it..."
  83. mkdir "$sorted_files"
  84. else
  85. logger 0 "something already exists with the name that I use for the folder that I use for sorted files (\"$sorted_files\"), but it's not a directory, quitting..."
  86. stat "$sorted_files"
  87. exit
  88. fi
  89. logger 1 "combing through all contents of folder \"$recovered_folder\"..."
  90. find . | grep -E '^\./recup_dir\.[0-9]+/' |
  91. while read filename
  92. do
  93. logger 2 "current item: \"$filename\""
  94. if test -f "$filename"
  95. then
  96. logger 2 "current item is a file, processing further..."
  97. echo "$filename"
  98. elif test -d "$filename"
  99. then
  100. logger 2 "current item is a folder, not a file. I'll search its contents, but I won't sort the folder by file type."
  101. logger 1 "found a folder with recovered files in it: \"$filename\""
  102. fi
  103. done |
  104. while read known_to_be_a_file
  105. do
  106. base_filename="$(basename "$known_to_be_a_file")"
  107. final_folder=""
  108. logger 2 "basename of file is \"$base_filename\""
  109. #file extension sorting magic done here
  110. if [[ "$base_filename" = *.* ]]
  111. then
  112. filename_without_extension="${base_filename%.*}"
  113. file_extension="${base_filename##*.}"
  114. else
  115. filename_without_extension="$base_filename"
  116. file_extension=""
  117. fi
  118. logger 2 "filename without extension: \"$filename_without_extension\""
  119. logger 2 "file extension: \"$file_extension\""
  120. if test -n "$file_extension"
  121. then
  122. logger 2 "file \"$base_filename\" has an extension"
  123. if ! test -d "$sorted_files/$file_extension"
  124. then
  125. logger 2 "\"$known_to_be_a_file\" is the first file I've found with extension \"$file_extension\", creating a folder for it"
  126. mkdir "$sorted_files/$file_extension"
  127. fi
  128. final_folder="./$sorted_files/$file_extension"
  129. logger 2 "moving \"$known_to_be_a_file\" to \"$final_folder\""
  130. mv "$known_to_be_a_file" "$final_folder"
  131. else
  132. final_folder="./$sorted_files/$files_without_extensions"
  133. if ! test -d "$final_folder"
  134. then
  135. logger 2 "folder \"$files_without_extensions\" doesn't currently exist, creating it"
  136. mkdir -p "$final_folder"
  137. fi
  138. logger 2 "file \"$known_to_be_a_file\" does not have a file extension, moving to folder \"$final_folder\""
  139. mv "$known_to_be_a_file" "$final_folder"
  140. fi
  141. done
  142. logger 1 "returning to previous working directory"
  143. popd 1>&2
  144. #delete fifo
  145. #rm "$fifo_filename"
  146. #rmdir "$fifo_folder"