【问题标题】:Bash: Script for finding files by mime-typeBash:通过 mime 类型查找文件的脚本
【发布时间】:2011-10-11 18:54:29
【问题描述】:

首先,我没有编写脚本的经验,所以请对我温柔

无论如何,我尝试制作一个脚本来按 mime 类型(音频、视频、文本...等)查找文件,但结果很糟糕。

#!/bin/bash

FINDPATH="$1"
FILETYPE="$2"


locate $FINDPATH* | while read FILEPROCESS

do

   if  file -bi "$FILEPROCESS" | grep -q "$FILETYPE"
   then
      echo $FILEPROCESS
   fi

done

它可以工作,但正如您所猜想的那样,性能并不是那么好。

那么,你们能帮我把它做得更好吗?而且,我不想依赖文件扩展名。

更新:

这是我现在使用的

#!/bin/bash

FINDPATH="$1"


find "$FINDPATH" -type f | file -i -F "::" -f - | awk -v FILETYPE="$2"  -F"::" '$2 ~ FILETYPE { print $1 }'

【问题讨论】:

    标签: file bash find mime-types


    【解决方案1】:
    #!/usr/bin/env bash
    
    mimetypes=$(sed -E 's/\/.*//g; /^$/d; /^#/d' /etc/mime.types | uniq)
    display_help(){
        echo "Usage: ${0##*/} [mimetype]"
        echo "Available mimetypes:"
        echo "$mimetypes"
        exit 2
    }
    
    [[ $# -lt 1 ]] && display_help
    
    ext=$(sed -E "/^${1}/!d; s/^[^ \t]+[ \t]*//g; /^$/d; s/ /\n/g" /etc/mime.types | sed -Ez 's/\n$//; s/\n/\\|/g; s/(.*)/\.*\\.\\(\1\\)\n/')
    find "$PWD" -type f -regex "$ext"
    

    【讨论】:

      【解决方案2】:

      分叉 (exec) 很昂贵。这只会运行一次file 命令,因此速度很快:

      find . -print | file -if - | grep "what you want" | awk -F: '{print $1}'
      

      locate what.want | file -if -
      

      检查man file

      -i    #print mime types
      -f -  #read filenames from the stdin
      

      【讨论】:

      • 谢谢,现在我知道为什么这么慢了 ;)
      【解决方案3】:
      #!/bin/bash
      find $1 | file -if- | grep $2 | awk -F: '{print $1}'
      

      【讨论】:

      • 这不会找到以.css结尾的文件,然后打开它们并搜索“text/css”吗?如果是这样,那不是我的意思。我不想依赖文件扩展名。
      • 这就是我从你的问题中可以理解的,你能更具体地说明你想如何确定 mime 类型吗?以及在哪个文件位置?
      • 例如,如果我像这样执行我的脚本:“findbytype.sh /home/me audio”,它会显示通过命令“file -i filename”报告为音频的所有文件
      • 好的,谢谢。这有点快,但问题是 grep 在 find 和 file 的输出中查找 $2,所以即使 file -i 输出不包含 $2 文件名或其任何父目录也可能包含 $2
      • 这不是问题,您可以使用一些文件扩展来缩小迭代范围,但这是脚本。你把它和真正的编程语言混淆了