2016-08-03 27 views
2

我想知道如何去查找..在给定目录中说文本文件。我想遍历我的目录中的所有文件,并且对于每个文本文件,我想将其转换为pdf文件。问题是,我不知道如何检查文件是否是bash shell中if语句的参数中的文本文件。如何使用bash shell检查if语句中的特定文件类型

设置我ListOfFiles=`ls -l` 和我遍历了for循环,我只需要知道如何在if声明检查文件类型。

预先感谢您。

+3

见http://mywiki.wooledge.org/ParsingLs - 你不应该在脚本中使用'ls'; globbing更有效率(不需要外壳程序,而'/ bin/ls'是一个单独的可执行文件),更加正确(请参阅链接)。 –

+3

... @ mklement0的答案包括一个分支,其性能优于正确性,但至少在那里是一个有意的选择,你得到的是回报。 (就我个人而言,我不会做出这样的选择 - 创建一个PDF文件非常昂贵,以至于单独调用候选文件的成本几乎会以总成本的百分比消失,除非您做了一些效率低下的事情,比如在所有文件中运行它,而不是仅限于新的,定期/定期的)。 –

回答

3

以下列出当前目录中的所有文本文件。

file --mime-type * -F$'\t' | awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }' 

注:这里假设你的文件名既没有嵌入式标签,也不嵌入式换行符,这通常不是一个问题。

  • file --mime-type * -F$'\t'确定每个文件的当前文件夹中的文件类型(*)和打印两列列表:在手的文件名,接着是选项卡(-F'$\t'),其次是用于对准的空间,接着是表示为MIME类型的文件类型。

  • awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }'然后分析每行到文件名和MIME类型(-F'\t *),测试如果MIME类型(字段2,$2)与(^)串text/plain启动,如果是,则输出文件名(字段1, $1)。

为了处理在一个循环中产生的文件,使用while

while IFS= read -r textfile; do 
    # Work with "$textfile" 
done < <(file --mime-type * -F$'\t' | awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }') 

请注意,当你呼叫file在条件一for file in *循环中,上述方法是效率更高。
为了记录在案,这里是你如何会在有条件使用命令:

if [[ $(file -b --mime-type "$file") == 'text/plain'* ]]; then ...