2010-10-10 10 views
6

Ho migliaia di file senza estensioni dopo il recupero (principalmente immagini). Ho bisogno di ordinarli in cartelle separate per tipo di file (le cartelle devono essere create durante il processo di ordinamento). Posso determinare il tipo di file in linux usando il comando "file". Qualcuno ha uno script bash per questo?Come ordinare i file in cartelle per tipo di file su bash (con il comando 'file')?

Ad esempio: Dir iniziale contiene i file: 001, 002, 003, 004. Dopo l'ordinamento dovrebbe essere 3 dir: 'jpeg' contiene 001.jpg, 003.jpg; 'Tiff' contiene 002.tiff e 'altri' contengono 004.

risposta

3

questa risposta non eseguire file comando più volte per ogni file, che è inutile

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 
} 
}' 

allo stesso modo, può essere fatto con bash4 + script utilizzando gli array associativi.

3

Che ne dite di qualcosa di simile:


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

lo uso cp, non può funzionare con le directory.

+0

Hai ragione, grazie, ma ci sono alcune carenze (vedi aggiustamento). – hoxnox

+1

uso inutile di 'ls' – ghostdog74

+0

come posso eliminarlo? –

2

regolazione risposta di Dadam:

#!/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 
2

Io uso questa e funziona per me:

#!/bin/bash 

self_name=`basename "$0"` 
for f in * 
do 
    if [ -f "$f" ] && [ "$f" != "$self_name" ]; then 
     filename="${f%.*}" 
     ext="${f##*.}" 
     mkdir $ext 

     mv "$f" "$ext/$f" 

     htmlfiles="{$f}_files" 
     if [ -d "$htmlfiles" ];then 
      mv "$htmlfiles" "$ext/$htmlfiles" 
     fi 

     if [ $? -ne 0 ] 
      then 
      echo "Error: Failed mv $f" 
     fi 
    fi 

    if [ -d "$f" ];then 
     mv "$f" "$ext/$f" 
    fi 
done 

si dovrebbe mettere nella directory ed eseguirlo e fare una sottodirectory per l'estensione

Problemi correlati