显示多个文件的内容

显示多个文件的内容

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

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

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

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

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

答案1

如果向标准head命令和某些实现tail传递多个文件参数(POSIXtail只接受 0 或 1 个文件参数),则打印带有文件名的标头。要打印整个文件,请使用tail -n +1(从第一行开始打印,即所有内容)。

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

tail -n +1 -- *

或者,如果您tail不能接受多个论点:

head -n 999999 -- *

(有些head -n -0 -- *,但这也不是标准的)。

head/的 GNU 实现tail也接受-v/--verbose选项,以确保即使只给出一个文件名也能打印标题。

--需要涵盖其中一个文件名以-.请注意,名为/的文件-仍将被视为stdin。使用可以解决这个问题,但这意味着前缀将包含在输出的标头中。headtail./*./

答案2

您可以通过以下方式将这一切一并完成find

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

这表示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

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

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

它循环遍历每个文件名参数,打印出文件名(以粗体绿色显示),然后捕获文件:

屏幕截图示例

那么命令就只是:

$ find . -type f -not -name .htaccess -exec cats {} \+

答案3

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

grep -vI "\x00" -- *

类似,但递归:

grep -vIr "\x00" -- .

格式为:filename: content.

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

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

旁注:

  • 在上面的示例中使用 NUL ( \x00) 可以防止显示二进制文件(这-I实际上是在做,但我们仍然需要使用一些模式)。
  • 使用通配符 ( *),它会自动忽略隐藏文件,例如.htaccess.

也可以看看:grep:显示文件名一次,然后显示带有行号的上下文在 Unix SE

答案4

如果您也想递归地打印它(例如,对于具有 .sql 扩展名的文件):

find -name "*.sql" -exec cat {} \; > all.sql

相关内容