我想知道如何去查找..在给定目录中说文本文件。我想遍历我的目录中的所有文件,并且对于每个文本文件,我想将其转换为pdf文件。问题是,我不知道如何检查文件是否是bash shell中if语句的参数中的文本文件。如何使用bash shell检查if语句中的特定文件类型
设置我ListOfFiles=`ls -l`
和我遍历了for
循环,我只需要知道如何在if
声明检查文件类型。
预先感谢您。
我想知道如何去查找..在给定目录中说文本文件。我想遍历我的目录中的所有文件,并且对于每个文本文件,我想将其转换为pdf文件。问题是,我不知道如何检查文件是否是bash shell中if语句的参数中的文本文件。如何使用bash shell检查if语句中的特定文件类型
设置我ListOfFiles=`ls -l`
和我遍历了for
循环,我只需要知道如何在if
声明检查文件类型。
预先感谢您。
以下列出当前目录中的所有文本文件。
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 ...
见http://mywiki.wooledge.org/ParsingLs - 你不应该在脚本中使用'ls'; globbing更有效率(不需要外壳程序,而'/ bin/ls'是一个单独的可执行文件),更加正确(请参阅链接)。 –
... @ mklement0的答案包括一个分支,其性能优于正确性,但至少在那里是一个有意的选择,你得到的是回报。 (就我个人而言,我不会做出这样的选择 - 创建一个PDF文件非常昂贵,以至于单独调用候选文件的成本几乎会以总成本的百分比消失,除非您做了一些效率低下的事情,比如在所有文件中运行它,而不是仅限于新的,定期/定期的)。 –