【问题标题】:Locate files which ONLY contain printable characters in bash script在 bash 脚本中找到仅包含可打印字符的文件
【发布时间】:2010-09-21 09:26:40
【问题描述】:

我正在尝试编写一个 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 和一些标记为纯文本的文件,其中至少包含一个不可打印的字符。

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

半天来,我一直在把头撞在墙上试图解决这个问题。 帮助! 提前致谢, 里克

【问题讨论】:

  • 你试过file这个命令了吗?
  • @eumiro:你可能会得到错误的结果,因为它不会查看整个文件。

标签: bash grep non-printable


【解决方案1】:

首先你可以/应该这样做

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

【讨论】:

    【解决方案2】:

    您可以使用 grep 的 -I 选项,它将二进制文件视为没有匹配的文件,只需使用始终匹配的正则表达式(如空字符串):

    if grep -qI -e '' $i
    

    【讨论】:

    • 感谢您的回复,这只会匹配完全匹配的文件
    • 这将只匹配完全二进制的文件,而不是二进制和可打印字符混合的文件。
    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2021-06-26
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多