Bash: 按 MIME 类型查找文件的脚本

10

首先,我不擅长编写脚本,请温柔对待我

无论如何,我尝试编写了一个查找文件的脚本,可以根据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 }'
3个回答

8

分叉(exec)很耗费资源。此方法仅运行一次file命令,因此速度快:

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

或者

locate what.want | file -if -

check man file

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

谢谢,现在我知道为什么它运行得这么慢了 ;) - masamunedark

1
#!/bin/bash
find $1 | file -if- | grep $2 | awk -F: '{print $1}'

这个会定位以.css结尾的文件,然后打开并搜索"text/css"吗?如果是的话,那不是我想要的。我不想依赖于文件名扩展名。 - masamunedark
这是我从你的问题中理解到的,你能否更具体地说明你想如何确定MIME类型?以及哪个文件位置? - Eric Fortis
如果我执行以下脚本: " findbytype.sh /home/me audio",它将显示所有被命令 " file -i filename " 报告为音频的文件。请注意,这是机器翻译,仅供参考。 - masamunedark
是的,谢谢。这样做会更快,但问题在于grep会在find和file的输出中查找$2,所以即使file -i的输出不包含$2,文件名或任何父目录都可能包含$2。 - masamunedark
这不是问题,你可以使用一些文件扩展名来缩小迭代范围,但这是脚本编程。你正在将它与真正的编程语言混淆。 - Eric Fortis
@masamunedark 我最终用它来检查 utf-8 文件。./findbytype.sh /home/ utf-8 - Eric Fortis

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接