Search code examples
linuxbashfilefile-type

How to sort files into folders by filetype on bash (with 'file' command)?


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.


Solution

  • 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.