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:] 相同的两种组合。所有这六种变体都会产生一些标记为二进制的文件,其中仅包含 plantext 和一些标记为纯文本的文件,其中至少包含一个不可打印的字符。

我需要找到一种方法来识别包含可打印字符的文件,即 AZ、az、0-9、标点符号、空格和换行符。包含不在此集合中的任何字符的所有文件都应归类为二进制文件。

半天来,我一直在用头撞墙试图对它进行分类。帮助!在此先感谢,瑞克

4

2 回答 2

7

首先你可以/应该做

for f in *

而不是将输出ls放在变量中。这样做的主要原因是能够处理包含空格的文件名。

其次,您需要将字符类括在一组括号中,否则它将把这些字符视为文字。我会将它们括在一组单引号中,以防止 shell 解释它们。不要使用-v和否定print类,看看它是否适合你。

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

如该行所示,始终在变量包含文件名时引用它们。

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

为了grep避免抱怨二进制文件,请使用-a.

该变量i通常用于整数或索引。使用ffile

最后:

#!/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 回答