2010-10-10 83 views
6

我有成千上萬的文件沒有擴展後恢復(主要是圖片)。我需要按文件類型將它們分類到不同的文件夾中(文件夾必須在排序過程中創建)。我可以使用「file」命令確定linux中的文件類型。有人有bash腳本嗎?如何通過bash上的文件類型(使用'文件'命令)將文件分類到文件夾中?

例如:初始目錄包含文件:001,002,003,004。排序後應該是3個目錄: 'jpeg'包含001.jpg,003.jpg; 「TIFF」包含002.tiff和「其他」包含004

回答

3

此答案不爲每個文件,這是不必要的

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

類似地執行file命令多次,可以使用關聯數組bash4 +腳本來完成。

3

怎麼是這樣的:


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

我用的CP,它無法與目錄工作。

+0

你是對的,謝謝你,但也有一些缺點(見調整)。 – hoxnox 2010-10-10 22:54:39

+1

無用ls' – ghostdog74 2010-10-10 23:29:23

+0

我該如何消除它? – 2010-10-11 09:38:21

2

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

我用這個和它的作品對我來說:

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

你應該把它放在你的目錄並運行它,它使一個子目錄延期

相關問題