82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| # This script takes an input directory and processes all files.
 | |
| # It creates a directory structure in the output directory based
 | |
| # on metadata of the file. The filename will also be created out
 | |
| # of metadata, or replaced with the sha1 hash of itself in order
 | |
| # to avoid duplicates.
 | |
| 
 | |
| usage() {
 | |
|   print "Usage: autosort <input directory> <output directory>";
 | |
|   exit 2
 | |
| }
 | |
| 
 | |
| # check input
 | |
| test -d "$1" || usage
 | |
| test -d "$2" || usage
 | |
| 
 | |
| # normalize relative paths
 | |
| _indir="$(readlink -f "$1")"
 | |
| _outdir="$(readlink -f "$2")"
 | |
| 
 | |
| ####################
 | |
| #   MAIN PROGRAM   #
 | |
| ####################
 | |
| 
 | |
| start(){
 | |
|   # trigger main loop
 | |
|   find "$_indir" -type f | while read _file;
 | |
|   do
 | |
|     # extract mime type
 | |
|     local _mime="$(file -bi "$_file")"
 | |
|     local _category=${_mime%%/*}
 | |
|     local _type=${_mime##*/}
 | |
| 
 | |
|     case "$_category" in
 | |
|       image) process_image "$_file" "$_type"; ;;
 | |
|       *) printf 'Unhandled Category: %s in %s\n' "$_category" "$_file"; ;;
 | |
|     esac
 | |
| 
 | |
|   done
 | |
| }
 | |
| 
 | |
| #################
 | |
| #   FUNCTIONS   #
 | |
| #################
 | |
| 
 | |
| process_image() {
 | |
| # $1 = file
 | |
| # $2 = mime type
 | |
|   case $2 in
 | |
|     jpeg) handle_jpeg "$1"; ;;
 | |
|     png) handle_jpeg "$1"; ;;
 | |
|     gif) handle_copy "$1" "image" "$2"; ;;
 | |
|     *) printf 'Unhandled Type: %s in %s\n' "$2" "$1"; ;;
 | |
|   esac
 | |
| }
 | |
| 
 | |
| handle_jpeg() {
 | |
| # $1 = file
 | |
|   local _exif="$(exifprint "$1")"
 | |
|   local _make="$(printf '%s' "$_exif" | grep '0x010f' | awk '{for(i=5;i<=NF;++i)print $i}')"
 | |
|   local _model="$(printf '%s' "$_exif" | grep '0x0110' | awk '{for(i=5;i<=NF;++i)print $i}')"
 | |
|   local _datetime="$(printf '%s' "$_exif" | grep '0x9003' | awk '{for(i=5;i<=NF;++i)print $i}')"
 | |
| 
 | |
|   test -z "$_make" && local _make=unknown
 | |
|   test -z "$_model" && local _model=unknown
 | |
|   test -z "$_datetime" && local _datetime="$(sha1 -q "$1")"
 | |
| 
 | |
|   local _out="$(printf '%s %s/%s' "$_make" "$_model" "$_datetime" | tr '\n' ' ' | tr ':' '-')"
 | |
| 
 | |
|   install -bDm 0666 "$1" "$_outdir/${_out}.jpg" && rm -f "$1"
 | |
| }
 | |
| 
 | |
| handle_copy() {
 | |
| # $1 = file
 | |
| # $2 = category
 | |
| # $3 = type
 | |
|   install -bDm 0666 "$1" "$_outdir/$2/$3/${1##*/}" && rm -f "$1"
 | |
| }
 | |
| 
 | |
| start
 | 
