显示许多文件的内容


19

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

./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组合使用,但是我还没有弄清楚该怎么做。谢谢你的时间!


Answers:


30

这两个标准的命令headtail打印头的文件名,如果你通过他们多个文件的说法。要打印整个文件,请使用tail -n +1(从第一行开始打印,即所有内容)。

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

tail -n +1 *

(严格来说,tail -n +1 -- *如果文件名之一以-。开头,则是必需的。)


简短而甜蜜,谢谢!你知道我在哪里可以读到--修饰符?
Znarkus 2011年

2
@Znarkus:--表示选项结束是大多数命令都遵守的约定。例如,tail -n +1 -- -f -g告诉tail那个-f-g有文件的读取(操作数),而不是选择。它是POSIX实用程序语法指南(适用于实用程序作者的文档)中的指南10 。我没有针对最终用户的阅读建议,我希望有一个不错的unix教程能在某个时候涵盖它。
吉尔斯(Gilles)'所以

短短一句话,因为很多其他的答案建议使用find,但后来使用一些Exec用打印格式:一种简单的方式来使用findtail是: find . -type f -print0 -name "*" | xargs -0 tail -n +1 ---print0xargs -0--确保命令也与空格的文件名或开始- )
IanH

14

您可以使用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 {} \+

另一个较短,因此被接受。很好的答案,谢谢!
Znarkus 2011年

6

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

grep -vI "\x00" -- *

和类似,但递归:

grep -vIr "\x00" -- .

格式为:filename: content

要具有与建议的格式相似的格式,应为:

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

旁注:

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

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


2
通常grep -r ^就足够了。
catpnosis

2

您可以使用此:

cat $(find Directory/ -not -name *.htaccess)

1

如果您想微调并且不浪费太多时间使用管道,请查找所有内容(尽管它是您所能找到的最强大的工具链)

只需尝试使用for循环,cat等。


0

如果您也想打印,则可以递归使用(例如,扩展名为.sql的文件):

find -name "*.sql" -exec cat {} \; > all.sql
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.