2010-10-10 9 views
6

Mam tysiące plików bez rozszerzeń po odzyskaniu (głównie zdjęcia). Muszę posortować je w oddzielne foldery według typu pliku (foldery muszą zostać utworzone podczas sortowania). Mogę określić typ pliku w Linuksie za pomocą komendy "file". Czy ktoś ma skrypt basha?Jak posortować pliki do folderów według typu pliku na bashu (poleceniem 'file')?

Na przykład: katalog początkowy zawiera pliki: 001, 002, 003, 004. Po sortowaniu powinno być 3 dirs: 'jpeg' zawiera 001.jpg, 003.jpg; 'Tiff' zawierać 002.tiff i 'Inne' zawiera 004.

Odpowiedz

3

Ta odpowiedź nie wykonuje poleceń file wielokrotnie dla każdego pliku, który jest niepotrzebny

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

Podobnie można zrobić z bash4 + skrypt za pomocą tablic asocjacyjnych.

3

Jak o coś takiego:


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

używam cp, nie może pracować z katalogów.

+0

Masz rację, dzięki, ale istnieją pewne niedociągnięcia (patrz dostosowanie). – hoxnox

+1

bezużyteczne użycie 'ls' – ghostdog74

+0

jak mogę go wyeliminować? –

2

Dadam za dostosowanie odpowiedź:

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

Używam tego i działa dla mnie:

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

Należy umieścić go w katalogu i uruchomić go i dokonać podkatalogu o przedłużenie

Powiązane problemy