我想列出当前工作目录(主目录)中所有不带扩展名(.txt)的 ASCII 文件。我先ls
在终端中输入命令,但我不知道应该在选项中输入什么,因为我想列出没有扩展名但只有名称的文件。我该怎么做?
答案1
运行以下命令:
find . -maxdepth 1 -type f ! -name "*.*" -exec grep -lvIP '[^[:ascii:]]' {} +
find
是更强大的ls
。. -maxdepth 1
仅表示当前目录-type f
仅表示文件! -name "*.*"
表示排除带有扩展名的文件-exec grep
...表示通过命令{} +
过滤文件列表grep
-lvIP '[^[:ascii:]]'
表示仅显示-l
不包含-v
任何非(^
)-ascii 字符且不包含二进制数据( )的文件。在模式中使用字符类需要-I
Perl 语法。-P
[:ascii:]
答案2
在 Linux 中,任何文件都可以包含任何内容。因此,名为 的文件a.txt
可能包含 JPEG 图片,而名为 的文件firmware.bin
可能包含 ASCII 文本。
如果您对文件的内容(包含“ASCII 文本”)以及文件的名称(.
文件名中不包含)感兴趣,@vanadium 在另一个答案的评论中的建议可能会得到改进,如下所示:
find . -maxdepth 1 -type f ! -name "*.*" -exec file -0 {} \; | \
grep -Pa "\0.*ASCII text.*$"
* 此命令正确执行不是ASCII text
选择名称中包含“二进制”的文件。
要得到仅文件名列表匹配的,将管道添加| grep -Pao '^[^\0]*'
到上面给出的命令的末尾。
答案3
可以通过以下方式实现find
:
find . -maxdepth 1 -type f ! -name "*.*"
请注意,这!
意味着NOT
,因此将删除任何包含的结果.
。