#!/bin/bash usage="+-------------------------------------------------------------------------------------+ | sort-photorec | | sorts the files recovered by photorec into folders by file extension | | usage: | | sort-photorec [-v|--verbose] [-q|--quiet] folder_which_contains_recup_dir.*_folders | +-------------------------------------------------------------------------------------+" #author info author_name="Erik Popp" author_website="erikpopp.com" #settings fifo_filename="/var/run/sort-photorec/$$" fifo_folder="/var/run/sort-photorec" files_without_extensions="No File Extension" sorted_files="Sorted Files" verbosity=1 #logger function logger { if test -n "$1" then if test "$1" -le "$verbosity" then if test -n "$2" then echo "sort-photorec: $2" 1>&2 else echo "sort-photorec: logger: you forgot to specify a log message" fi fi else echo "sort-photorec: logger: you forgot to specify a log level" fi } #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 #mkdir "$fifo_folder" #mkfifo -m 'u=rw,go=' "$fifo_filename" #process arguments for argument in $@ do case "$argument" in -v|--verbose) let verbosity++ logger 0 "increasing verbosity to $verbosity" ;; -q|--quiet) let verbosity-- logger 0 "decreasing verbosity to $verbosity" ;; *) if test -d "$argument" then if test -z "$recovered_folder" then logger 1 "sorting recovered files in \"$1\"" recovered_folder="$argument" else logger 0 "folder with recovered files already specified (\"$recovered_folder\"), refusing to set a second folder to check" echo "$usage" logger 0 "quitting..." exit fi else logger 0 "\"$argument\" is not a folder, quitting" echo "$usage" exit fi esac done if test -z "$recovered_folder" then logger 0 "you forgot to specify the folder that the recovered files are in, quitting" echo "$usage" exit fi #process files logger 1 "moving to folder with recovered files \"$recovered_folder\"" pushd "$recovered_folder" 1>&2 if test -d "$sorted_files" then logger 0 "folder for sorted files already exists, using it..." logger 1 "am I continuing from a previous run?" elif test ! -e "$sorted_files" then logger 1 "folder for sorted files (\"$sorted_files\") does not exist, creating it..." mkdir "$sorted_files" else 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..." stat "$sorted_files" exit fi logger 1 "combing through all contents of folder \"$recovered_folder\"..." find . | grep -E '^\./recup_dir\.[0-9]+/' | while read filename do logger 2 "current item: \"$filename\"" if test -f "$filename" then logger 2 "current item is a file, processing further..." echo "$filename" elif test -d "$filename" then 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." logger 1 "found a folder with recovered files in it: \"$filename\"" fi done | while read known_to_be_a_file do base_filename="$(basename "$known_to_be_a_file")" final_folder="" logger 2 "basename of file is \"$base_filename\"" #file extension sorting magic done here if [[ "$base_filename" = *.* ]] then filename_without_extension="${base_filename%.*}" file_extension="${base_filename##*.}" else filename_without_extension="$base_filename" file_extension="" fi logger 2 "filename without extension: \"$filename_without_extension\"" logger 2 "file extension: \"$file_extension\"" if test -n "$file_extension" then logger 2 "file \"$base_filename\" has an extension" if ! test -d "$sorted_files/$file_extension" then logger 2 "\"$known_to_be_a_file\" is the first file I've found with extension \"$file_extension\", creating a folder for it" mkdir "$sorted_files/$file_extension" fi final_folder="./$sorted_files/$file_extension" logger 2 "moving \"$known_to_be_a_file\" to \"$final_folder\"" mv "$known_to_be_a_file" "$final_folder" else final_folder="./$sorted_files/$files_without_extensions" if ! test -d "$final_folder" then logger 2 "folder \"$files_without_extensions\" doesn't currently exist, creating it" mkdir -p "$final_folder" fi logger 2 "file \"$known_to_be_a_file\" does not have a file extension, moving to folder \"$final_folder\"" mv "$known_to_be_a_file" "$final_folder" fi done logger 1 "returning to previous working directory" popd 1>&2 #delete fifo #rm "$fifo_filename" #rmdir "$fifo_folder"