从命令行,显示多个文件内容的最简单方法是什么?我的目录如下所示。
./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。使用可以解决这个问题,但这意味着前缀将包含在输出的标头中。head
tail
./*
./
答案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