如何在linux终端上只打印txt文件?
在我的Linux目录中,我有6个文件。5个文件是txt文件,1个文件是.tar.gz类型的文件。如何仅向终端打印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
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命令来抑制这种情况。如果您希望进一步处理此文件名,而不是仅向用户显示它,这将非常有用,但它可能会损坏您的解析逻辑,特别是当文件名包含换行符时
最后,不要忘记,在任何情况下,您都可以看到系统认为文本文件是什么。这不是必须的