如何查找仅包含字母数字字符的文件?

如何查找仅包含字母数字字符的文件?

如何查找仅包含字母数字字符 和 的文件[áéíóúñ.,¿?¡!()]

我有一些稀疏的纯文本文件,我需要将它们与脚本和任何其他东西分开,它们只是西班牙语诗歌,因此不太可能包含[#></:]。我带着

sudo find . -type f -not -path '*/.??*/*' -exec file {}  \; \
  | grep ": Unicode text, UTF-8 text"$ \
  | cut -d: -f1 \
  | while read file; do 
     grep -iv '[a-z0-9\.\/_\-áéíóúñ]' "$file" || echo $file
    done

但它匹配行,我需要匹配整个文件。

编辑:至少对我有用的是:

sudo find . -type f -not -path "*/.Trash-*/*" -not -path '*/.??*/*' -exec file {} \;|
grep ": Unicode text, UTF-8 text"$|
cut -d: -f1|
while read file do 
grep -ivq "^[a-z0-9\.\/_\-\ \,\"áéíóúñ\!¿¡?\(\)]*$" "$file"||
echo "$file">>/tmp/textlocation ; done

添加 ^ 和 $ 的简单解决方案就产生了差异。这里列出的 -L 解决方案可能有效并且更优雅,但我的解决方案完成了这项工作。

答案1

如果我理解正确的话,你可以使用 GNU grep,搜索以下文件不匹配[#></:]字符集:

$ grep -Lr '[#></:]'
  • -L将列出与模式不匹配的文件

    -L, --files-without-match
    禁止正常输出;相反,打印每个通常不会打印输出的输入文件的名称。扫描将在第一个匹配处停止。

  • -r将递归搜索

    -r, --recursive
    递归地读取每个目录下的所有文件,仅在符号链接位于命令行时才遵循它们。请注意,如果未给出文件操作数,grep 将搜索工作目录。这相当于 -d 递归选项。

-Z如果您需要对文件执行除列出之外的某些操作,您还可以添加该选项。

答案2

我会尝试以下-q选项:《安静;不要向标准输出写入任何内容。如果发现任何匹配项,即使检测到错误,也会立即以零状态退出。 »

这可以避免打印任何内容并使您能够获取返回代码。

另请注意,仅包含字母数字的行是"^[a-z0-9\.\/_\-áéíóúñ]*$" (带有^,*$)然后我会输入

grep -ivq "^[a-z0-9\.\/_\-áéíóúñ]*$" || echo $file

您可能需要添加一些字符:空格、逗号……如果不这样做,许多诗歌将无法通过!

相关内容