2010-10-10 46 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 

你应该把它放在你的目录并运行它,它使一个子目录延期

相关问题