如何在linux终端上只打印txt文件?

时间:2017-01-11 21:41:02

标签: linux bash shell

在我的Linux目录中,我有6个文件。 5个文件是txt文件,1个文件是.tar.gz类型文件。如何只在终端上打印txt文件的名称?

directory :dir
content:
ex1, ex2, ex3, ex4, ex5, ex6.tar.gz

5 个答案:

答案 0 :(得分:0)

命令'file',后跟文件名,将返回文件的类型。

您可以遍历目录中的文件,使用每个文件名作为'file'命令的输入,如果是文本文件,则打印该文件名。

以下内容包括file命令的一些额外输出,我不知道如何删除,但它确实为您提供了所需的文件名:

#!/bin/bash
for f in *
do
  file $f | grep text
done

您可以将其放入要从中获取文件名的目录中的shell脚本,然后从命令行运行它。

答案 1 :(得分:0)

因为你没有文件扩展名(.txt),我会尝试排除。

ls | grep -v tar.gz

如果您有多种类型,请使用扩展程序。

答案 2 :(得分:0)

更新了答案

正如@ hek2mgl在评论中指出的,一个更强大的解决方案是使用nul字符(可能不会出现在文件名中)来分隔文件名,并处理包含换行符和冒号的文件名:

file -0 * | awk -F'\0' '$2 ~ /text/{print $1}'

原始答案

我会这样做:

file * | awk -F: '$2~/text/{print $1}'

运行file以查看每个文件的类型,并将名称和类型传递给以冒号分隔的awkawk然后在第二个字段中查找单词text,如果找到,则打印第一个字段 - 即文件名。

尝试单独运行以下更简单的命令,看看它是如何工作的:

file *

答案 3 :(得分:0)

使用package main import ( "math" ) const ( a = 2.0 // height of curve's peak b = 0.5 // position of the peak c = 0.1 // standart deviation controlling width of the curve //( lower abstract value of c -> "longer" curve) ) func curveFunc(x float64) float64 { return a *math.Exp(-math.Pow(x-b, 2)/2.0*math.Pow(c, 2)) } 命令的建议是正确的。这里的问题是解析这个命令的输出,因为(1)文件名可以包含任何字符,(2)file命令的具体输出有点不可预测,因为它取决于如何称为魔术文件存在。

如果我们依赖于file命令的输出的说明文本 - 即解释它是什么文件的那部分 - 的事实总是包含单词 text 如果它是一个文本文件,它永远不会包含冒号,我们可以按如下方式处理它:

输出中的最后一个冒号必须将文件名与说明分开。左边的所有内容都是文件名,如果在右边部分出现单词file(注意 text 之前的前导空格!),我们就会有一个文本文件。

这仍然让我们看到那些(希望很少见)文件名包含不可打印字符的情况,它们将被翻译成它们的八进制等价物,这可能是您想要看到的,也可能不是。您可以通过将text选项传递到文件命令来抑制此操作。如果你想进一步处理这个文件名而不是只是把它显示给用户,这很有用,但它可能会破坏你的解析逻辑,特别是如果文件名包含换行符。

最后,不要忘记在任何情况下,您都会看到系统认为文本文件的内容。这不一定与定义为文本文件相同。

答案 4 :(得分:0)

鉴于此文件目录:

$ file *
1.txt:      UTF-8 Unicode (with BOM) text, with CRLF line terminators
2.pdf:      PDF document, version 1.5
3.pdf:      PDF document, version 1.5
4.dat:      data
5.txt:      ASCII text
6.jpg:      JPEG image data, JFIF standard 1.02, aspect ratio, density 100x100, segment length 16, baseline, precision 8, 2833x972, frames 3
7.html:     HTML document text, UTF-8 Unicode text, with very long lines, with no line terminators
8.js:       UTF-8 Unicode text
9.xml:      XML 1.0 document text
A.pl:       a /opt/local/bin/perl script text executable, ASCII text
B.Makefile: makefile script text, ASCII text
C.c:        c program text, ASCII text
D.docx:     Microsoft Word 2007+

您可以看到纯ascii的唯一文件是5.txt,9.xml和A-C。根据{{​​1}},其余的是二进制或UTF。

您可以使用Bash glob循环遍历文件并使用file来测试每个文件。此保存必须解析文件名file的输出,但依赖于file来准确识别您认为是“文本”的内容:

file

如果您不能使用for fn in *; do [ -f "$fn" ] || continue fo=$(file "$fn") [[ $fo =~ ^"$fn":.*text ]] || continue echo "$fn" done ,这当然是最简单的方法,您可以打开文件并查找二进制字符。使用Perl:

file

在这种情况下,我在文件的前2000个字节中查找ascii与非ascii的百分比。 YMMV但允许查找for fn in *; do [ -f "$fn" ] || continue head -c 2000 "$fn" | perl -lne '$tot+=length; $cnt+=s/[^[:ascii:]]//g; END{exit 1 if($cnt/$tot>0.03);}' [ $? -eq 0 ] || continue echo "$fn" done 将报告为UTF的文件(因为它有二进制BOM),但大部分文件都是ascii。

对于该目录,两个Bash脚本报告(我对每个文件的评论):

file

由于1.txt # UTF file with a binary BOM but no UTF characters -- all ascii 4.dat # text based configuration file for a router. file does not report this 5.txt # Pure ascii file 7.html # html file 8.js # Javascript sourcecode 9.xml # xml file all text A.pl # Perl file B.Makefile # Unix make file C.c # C source file 不认为所有ascii文件file都是文本,因此第一个Bash脚本不报告它,而是由第二个报告。否则 - 相同的输出。