2016-08-03 26 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 ...