Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux终端上只打印txt文件?_Linux_Bash_Shell - Fatal编程技术网

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

如何在linux终端上只打印txt文件?,linux,bash,shell,Linux,Bash,Shell,在我的Linux目录中,我有6个文件。5个文件是txt文件,1个文件是.tar.gz类型的文件。如何仅向终端打印txt文件的名称 directory :dir content: ex1, ex2, ex3, ex4, ex5, ex6.tar.gz 命令“file”后跟文件名,将返回文件类型 您可以循环浏览目录中的文件,使用每个文件名作为“file”命令的输入,如果是文本文件,则打印该文件名 下面是file命令的一些额外输出,我还不确定如何删除它,但它确实提供了所需的文件名: #!/bin/b

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

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

命令“file”后跟文件名,将返回文件类型

您可以循环浏览目录中的文件,使用每个文件名作为“file”命令的输入,如果是文本文件,则打印该文件名

下面是file命令的一些额外输出,我还不确定如何删除它,但它确实提供了所需的文件名:

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

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

命令“file”后跟文件名,将返回文件类型

您可以循环浏览目录中的文件,使用每个文件名作为“file”命令的输入,如果是文本文件,则打印该文件名

下面是file命令的一些额外输出,我还不确定如何删除它,但它确实提供了所需的文件名:

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

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

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

ls | grep-v tar.gz


如果您有多种类型,则使用扩展名。

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

ls | grep-v tar.gz


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

更新的答案

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

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

我会这样做:

file * | awk -F: '$2~/text/{print $1}'
运行
file
查看每个文件的类型,并将名称和类型传递给
awk
,以冒号分隔
awk
然后在第二个字段中查找单词
text
,如果找到,则打印第一个字段,即文件名

尝试单独运行以下更简单的命令以查看其工作方式:

file *

更新的答案

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

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

我会这样做:

file * | awk -F: '$2~/text/{print $1}'
运行
file
查看每个文件的类型,并将名称和类型传递给
awk
,以冒号分隔
awk
然后在第二个字段中查找单词
text
,如果找到,则打印第一个字段,即文件名

尝试单独运行以下更简单的命令以查看其工作方式:

file *

使用
文件
命令的建议是正确的。这里的问题是解析这个命令的输出,因为(1)文件名可以包含几乎任何字符,(2)
file
命令的具体输出有点不可预测,因为它取决于所谓的魔法文件是如何呈现的

如果我们依赖于
文件
命令输出的解释文本(即解释文件内容的部分)始终包含单词text(如果是文本文件),并且从不包含冒号,我们可以按如下方式处理:

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

这仍然给我们留下了一些(希望是罕见的)文件名包含不可打印字符的情况,它们将被转换为八进制等价物,这可能是您想要看到的,也可能不是您想要看到的。您可以通过将
-r
选项传递给file命令来抑制这种情况。如果您希望进一步处理此文件名,而不是仅向用户显示它,这将非常有用,但它可能会损坏您的解析逻辑,特别是当文件名包含换行符时


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

使用
文件
命令的建议是正确的。这里的问题是解析这个命令的输出,因为(1)文件名可以包含几乎任何字符,(2)
file
命令的具体输出有点不可预测,因为它取决于所谓的魔法文件是如何呈现的

如果我们依赖于
文件
命令输出的解释文本(即解释文件内容的部分)始终包含单词text(如果是文本文件),并且从不包含冒号,我们可以按如下方式处理:

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

这仍然给我们留下了一些(希望是罕见的)文件名包含不可打印字符的情况,它们将被转换为八进制等价物,这可能是您想要看到的,也可能不是您想要看到的。您可以通过将
-r
选项传递给file命令来抑制这种情况。如果您希望进一步处理此文件名,而不是仅向用户显示它,这将非常有用,但它可能会损坏您的解析逻辑,特别是当文件名包含换行符时

最后,不要忘记,在任何情况下,您都可以看到系统认为文本文件是什么。这不是必须的