如何在终端中获取目录中所有文件的文件名和内容

如何在终端中获取目录中所有文件的文件名和内容

假设目录中有未知数量的文件。我想获取每个文件内的内容以及文件名,如下例所示。

file1“文件一中的内容”
file2“文件二中的内容”
file3“文件三中的内容”
....................................... .filen
“文件 n 中的内容”

我怎样才能做到这一点?

答案1

假设文件是文本的,并且不太大(例如少于 10000 行)。

那么你可以尝试使用头(1)(也许head -vn -0 file*与 GNU 头一样)像这样

head -10000 file1 file2 file3

请记住,有些文件是二进制的,即它们包含文本以外的内容。例如,一个核心转储, 一个sqlite数据库文件,一个巴布亚新几内亚图像,一个可执行文件文件,甚至一些开放文档使用 LibreOffice 创建的文件。在此类文件上,使用head(或猫(1))不会给出好的结果,因为它们不是文本文件但包含几乎任意字节的序列。

您可能还对文件(1)命令。它尝试猜测给定文件的内容类型。另请阅读有关媒体类型(或 MIME 类型)

请记住,在类 Unix 系统上,文件实际上是一个i节点并且可以有一些名称(参见索引节点(7),链接(2),ln(1)了解更多)。文件名没有多大意义。文件基本上是一个字节序列,具有某种命名方式。如何使用该序列取决于访问该文件的程序。

您可能会对xdg-open它尝试以图形方式显示各种类型的文件感兴趣(它正在适应这些文件的内容)。

另请阅读有关通配。看全局(7)。也许了解for你的内置功能。阅读bash 循环结构

答案2

对于特定的输出格式,您可以执行以下操作:

awk '{print substr(FILENAME, 3)" \""$0"\" "}' ./file*

这将打印文件的名称,后跟文件每一行引号内的行的内容。

我们添加一个./前缀,将其删除以substr()解决将awk参数视为filex=y.txt变量赋值而不是文件名的问题。

如果文件已包含"字符并且您希望将它们显示为\"(并\消除\\歧义):

awk '{gsub(/[\\"]/, "\\\\&"); print substr(FILENAME, 3)" \""$0"\" "}' ./file*

(这并不涉及"文件名本身)。

答案3

这可以解决问题:

for f1 in *; do echo -n "$f1"" "\"; cat "$f1"; echo "\""; done

它循环遍历目录中的所有文件,然后为每个文件显示其名称,后跟引号中的内容。

相关内容