views:

53

answers:

3

I have thousands of files without extensions after recovery (mostly pictures). I need to sort them into separate folders by filetype (folders must be created during sort process). I can determine filetype in linux using "file" command. Does somebody have bash script for it?

For example: Initial dir contains files: 001, 002, 003, 004. After sorting should be 3 dirs: 'jpeg' contain 001.jpg, 003.jpg; 'tiff' contain 002.tiff and 'others' contain 004.

+2  A: 

How about something like this:


mkdir -p `file -b --mime-type *|uniq`
for x in `ls`
do
        cp $x `file -b --mime-type $x`
done

I use cp, it can't work with directories.

Dadam
You are right, thanks, but there are some shortcomings (see adjustment).
hoxnox
useless use of `ls`
ghostdog74
how can I eliminate it?
Dadam
+1  A: 

Dadam's answer adjustment:

#!/bin/bash

file --mime-type -F"&" [YOUR PATH]/* > filetypes.txt
mkdir -p `cut -f2 -d"&" filetypes.txt | sed 's/[ ,:]//g' | sort -u`
for x in `cut -f1 -d"&" filetypes.txt`
do
  mv $x `file -b --mime-type $x | sed 's/[ ,:]//g'`
done 
hoxnox
A: 

This answer does not execute file command multiple times for each file, which is unnecessary

file  -N --mime-type -F"-&-" * | awk -F"-&-" 'BEGIN{q="\047"}
{
  o=$1
  gsub("/","_",$2);sub("^ +","",$2)
  if (!($2  in dir )) {
    dir[$2]
    cmd="mkdir -p "$2
    print cmd
    #system(cmd) #uncomment to use
  }
  files[o]=$2
}
END{
 for(f in files){
    cmd="cp "q f q"  "q files[f]"/"f".jpg" q
    print cmd
    #system(cmd) #uncomment to use
 }
}'

similarly, can be done with bash4+ script using associative arrays.

ghostdog74