2016-08-03 5 views
2

どのように私が探しているか知りたいです。私は自分のディレクトリ内のすべてのファイルを繰り返し処理したいので、すべてのテキストファイルについて、pdfファイルに変換したい。問題は、ファイルがbashシェルのif文のパラメータ内のテキストファイルであるかどうかをチェックする方法がわかりません。bashシェルを使用してif文で特定のファイルタイプをチェックする方法

私はListOfFiles=`ls -l` を設定すると、私はforループで反復処理、私はちょうどif文で、ファイルの種類をチェックする方法を知っておく必要があります。

ありがとうございます。

+3

はhttp://mywiki.wooledge.org/ParsingLsを参照してください - あなたはスクリプトで 'ls'を使用しないでください。 globはより効率的です(シェルの外部のプログラムは必要ありませんが、 '/ bin/ls'は別の実行可能ファイルです)、もっと正確です(リンクを参照)。 –

+3

... @ mklement0の答えには、正確性よりもパフォーマンスのために行われたトレードオフを含むブランチが含まれていますが、少なくともそこには意図的な選択肢があり、その代わりに何かが得られます。 (個人的には、私はその選択をしません.PDFを作成することは、すべてのファイルで実行するような非効率な作業をしない限り、 、新規のものとは対照的に、定期的/間接的に)。 –

答えて

3

以下は、現在のディレクトリ内のすべてのテキストファイルの一覧です。

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

注:これは一般的に問題ではありませんこれは、あなたのファイル名が埋め込まれたタブも埋め込まれた改行もないを持っていることを前提としています。 、手元のファイル名、タブ(-F'$\t')続いて、位置合わせのためのスペースが続く:

  • file --mime-type * -F$'\t'は、現在のフォルダ内の各ファイルのファイルタイプ(*)を決定し、二列のリストを印刷しますMIMEタイプとして表されるファイルタイプが続きます。

  • awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }' MIMEタイプ(フィールド2、$2)は(^)で始まる場合、次いで、ファイル名とMIMEタイプ(-F'\t *)に各行を解析テストストリングtext/plainと、もしそうであれば、フィールド1(ファイル名を印刷$1)。 、ループ内で結果のファイルを処理whileを使用するには

:あなたはfor file in *ループ内で条件付きでコールfileを得るが、上記のアプローチがあることを

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

注意はるかに効率的です。レコードの
は、ここにあなたが条件付きでコマンドを使用する方法は次のとおりです。

if [[ $(file -b --mime-type "$file") == 'text/plain'* ]]; then ... 
関連する問題