1

ファイルでいっぱいのディレクトリを見て、それらをプレーンテキストまたはバイナリとして分類するbashスクリプトを作成しようとしています。ファイルにプレーンテキスト文字のみが含まれている場合、ファイルはプレーンテキストであり、それ以外の場合はバイナリです。これまでのところ、grep の次の順列を試しました。

#!/bin/bash
FILES=`ls`
for i in $FILES
do
    ########GREP SYNTAX###########
    if grep -qv -e[:cntrl:] $i
    ########/GREP SYNTAX##########
    then
        mv $i $i-plaintext.txt
    else
        mv $i $i-binary.txt
    fi
done

grep 構文では、-v フラグを指定せずに if ステートメントの分岐を入れ替えたり、[:alnum:] と [:print:] を組み合わせて同じことを試したりしました。これらの 6 つのバリエーションはすべて、プランテキストのみで構成されるバイナリ ラベルの付いたファイルと、少なくとも 1 つの印刷不可能な文字を含むプレーンテキストのラベルが付いたファイルを生成します。

印刷可能な文字、つまり A ~ Z、a ~ z、0 ~ 9、句読点、スペース、および改行のみを含むファイルを識別する方法を見つける必要があります。このセットにない文字を含むすべてのファイルは、バイナリとして分類する必要があります。

私はこれを整理しようとして半日壁に頭をぶつけていました。ヘルプ!前もってありがとう、リク

4

2 に答える 2

7

最初にできる/すべきこと

for f in *

lsの出力を変数に入れる代わりに。これを行う主な理由は、スペースを含むファイル名を処理できるようにするためです。

次に、文字クラスを一連の括弧で囲む必要があります。そうしないと、これらの文字がリテラルとして認識されます。そして、シェルがそれらを解釈するのを防ぐために、それらを一重引用符で囲みます。クラスを使用-vしたり否定したりしないでください。それが機能するかどうかを確認してください。print

if grep -aq -e '[^[:print:]]' "$f"

そして、その行に示されているように、変数にファイル名が含まれている場合は常に変数を引用してください。

mv "$f" "$f-plaintext.txt"

grepバイナリ ファイルについて不平を言わないようにするには、 -a.

変数iは、整数またはインデックスによく使用されます。fまたはを使用しfileます。

ついに:

#!/bin/bash
for f in *
do
    if grep -aq -e '[^[:print:]]' "$f"
    then
        mv "$f" "$f-binary.txt"
    else
        mv "$f" "$f-plaintext.txt"
    fi
done
于 2010-09-21T09:52:49.147 に答える
0

grep の -I オプションを使用すると、バイナリ ファイルを一致のないファイルとして扱い、常に一致する正規表現 (空の文字列など) を使用できます。

if grep -qI -e '' $i
于 2010-09-21T09:33:07.970 に答える