如何查找仅包含字母数字字符 和 的文件[áéíóúñ.,¿?¡!()]
?
我有一些稀疏的纯文本文件,我需要将它们与脚本和任何其他东西分开,它们只是西班牙语诗歌,因此不太可能包含[#></:]
。我带着
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
您可能需要添加一些字符:空格、逗号……如果不这样做,许多诗歌将无法通过!