显示多个文件的内容

Zna*_*kus 32 command-line files

在命令行中,显示多个文件内容的最简单方法是什么?我的目录如下所示。

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess
Run Code Online (Sandbox Code Playgroud)

现在我想查看除.htaccess. 它可能看起来像:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]
Run Code Online (Sandbox Code Playgroud)

我认为这应该可以通过 find、xargs 和 cat 的组合来实现,但我还没有弄清楚如何。谢谢你的时间!

Gil*_*il' 46

如果您传递多个文件参数,则这两个标准命令headtail打印带有文件名的标题。要打印整个文件,请使用tail -n +1(从第一行开始打印,即所有内容)。

在这里,您似乎想要查看除名称以点开头的单个文件之外的所有文件。点文件在 unix 下是“隐藏的”:它们不会出现在默认输出ls或通配符匹配中。因此匹配每个非隐藏文件只需使用*.

tail -n +1 *
Run Code Online (Sandbox Code Playgroud)

(严格来说,tail -n +1 -- *如果其中一个文件名以-.开头,则需要。)

  • @Znarkus:`--` 表示选项结束是大多数命令遵守的约定。例如`tail -n +1 -- -f -g` 告诉`tail``-f` 和`-g` 是要读取的文件(操作数)而不是选项。它是 [POSIX 实用程序语法指南](http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02) 中的准则 10(供实用程序编写者使用的文档)。我没有针对最终用户的阅读建议,我希望在某个时候有一个很好的 unix 教程来涵盖它。 (2认同)

Mic*_*zek 21

您可以通过以下方式完成所有操作find

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;
Run Code Online (Sandbox Code Playgroud)

这告诉在当前目录 ( ) 中find查找所有文件 ( -type f),.除了 ( -not) 一个名为.htaccess( -name .htaccess) 的文件。然后它打印 ( -printf) 一个换行符,后跟文件名 ( %p),然后cat在文件 ( -exec cat {} \;)上运行。这将为您提供如下输出:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3
Run Code Online (Sandbox Code Playgroud)

如果您经常这样做,可能值得将其粘贴在 shell 脚本或函数中;我有一个名字cats就是这样做的:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done
Run Code Online (Sandbox Code Playgroud)

它遍历每个文件名参数,打印出文件名(以粗体绿色显示),然后对文件进行分类:

示例截图

那么命令就是:

$ find . -type f -not -name .htaccess -exec cats {} \+
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 6

要显示当前文件夹中所有文件的内容,请尝试:

grep -vI "\x00" -- *
Run Code Online (Sandbox Code Playgroud)

和类似的,但递归:

grep -vIr "\x00" -- .
Run Code Online (Sandbox Code Playgroud)

格式为:filename: content.

要具有与建议类似的格式,它将是:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done
Run Code Online (Sandbox Code Playgroud)

旁注:

  • \x00在上面的例子中使用 NUL ( ) 会阻止显示二进制文件(这-I实际上是这样做的,但我们仍然必须使用某种模式)。
  • 使用通配符 ( *),它会自动忽略隐藏文件,例如.htaccess.

另请参阅:grep:显示文件名一次,然后在 Unix SE 上显示带有行号的上下文

  • 通常`grep -r ^` 就足够了。 (2认同)