连接多个文件但包含文件名作为节标题

Nic*_*ick 324 unix terminal header concatenation cat

我想将一些文本文件连接到终端中的一个大文件中.我知道我可以使用cat命令执行此操作.但是,我希望每个文件的文件名都在该文件的"数据转储"之前.有人知道怎么做吗?

我目前有什么:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt
Run Code Online (Sandbox Code Playgroud)

期望的输出:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
Run Code Online (Sandbox Code Playgroud)

DS.*_*DS. 477

正在寻找相同的东西,并发现这建议:

tail -n +1 file1.txt file2.txt file3.txt
Run Code Online (Sandbox Code Playgroud)

输出:

==> file1.txt <==
<contents of file1.txt>

==> file2.txt <==
<contents of file2.txt>

==> file3.txt <==
<contents of file3.txt>
Run Code Online (Sandbox Code Playgroud)

如果只有一个文件,则不会打印标题.如果使用GNU utils,您可以使用-v始终打印标题.

  • 真棒`-n + 1`选项!另一种方法:`head -n-0 file1 file2 file3`. (5认同)
  • 在 MacOS X 上与 BSD tail 和 GNU tail 配合使用都很好。你可以省略 `-n` 和 `+1` 之间的空格,如 `-n+1`。 (4认同)
  • `tail -n +1*`正是我要找的,谢谢! (3认同)
  • 这也适用于GNU尾部(GNU Coreutils的一部分). (2认同)
  • 适用于 MacOsX 10.14.4 `sudo ulimit -n 1024; 找到 -f 。-name "*.rb" | xargs tail -n+1 &gt; ./source_ruby.txt` (2认同)

小智 174

我用grep做类似的事情:

grep "" *.txt
Run Code Online (Sandbox Code Playgroud)

它没有给你一个'标题',但每行都有文件名前缀.

  • 如果有多个文件,`grep`只会打印文件头.如果要确保始终打印文件路径,请使用`-H`.如果你不希望标题使用`-h`.另请注意,它将为STDIN打印`(标准输入)`. (9认同)
  • 如果`*.txt`只扩展为一个文件,则输出中断.在这方面,我建议`grep''/ dev/null*.txt` (7认同)
  • +1 向我展示了 grep 的新用途。这完全满足了我的需求。就我而言,每个文件仅包含一行,因此它给了我一个格式整齐、易于解析的输出 (2认同)

Max*_*ted 97

这应该也可以解决问题:

find . -type f -print -exec cat {} \;
Run Code Online (Sandbox Code Playgroud)

手段:

find    = linux `find` command finds filenames, see `man find` for more info
.       = in current directory
-type f = only files, not directories
-print  = show found file
-exec   = additionally execute another linux command
cat     = linux `cat` command, see `man cat`, displays file contents
{}      = placeholder for the currently found filename
\;      = tell `find` command that it ends now here
Run Code Online (Sandbox Code Playgroud)

您还可以通过布尔运算符(如-and或)组合搜索-or.find -ls也很好.

  • 您也可以使用`-printf`来自定义输出.例如:`find*.conf -type f -printf'\n ==>%p <== \n'-exec cat {} \;`匹配`tail -n +1*'的输出 (17认同)
  • 这是linux的标准find命令.它搜索当前目录中的所有文件,打印它们的名称,然后为每个文件输入文件.省略`-print`不会在`cat`之前打印文件名. (4认同)
  • 你能解释一下这个命令的作用吗?正是我需要的 (2认同)
  • 如果你想要颜色,你可以使用`find`允许多个`-exec`s的事实:`find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n ' {} \; -exec cat {} \;` (2认同)

Chr*_*rle 23

这应该做的伎俩:

for filename in file1.txt file2.txt file3.txt; do
    echo "$filename"
    cat "$filename"
done > output.txt
Run Code Online (Sandbox Code Playgroud)

或者以递归方式对所有文本文件执行此操作:

find . -type f -name '*.txt' -print | while read filename; do
    echo "$filename"
    cat "$filename"
done > output.txt
Run Code Online (Sandbox Code Playgroud)

  • ......关心详细说明?这就像bash代码一样简单. (2认同)

小智 16

我有一系列以stats.txt结尾的文件,我希望与文件名连接.

我做了以下操作,当有多个文件时,"more"命令包含文件名作为标题.

more *stats.txt > stats.txt
Run Code Online (Sandbox Code Playgroud)

或者一般情况

more FILES_TO_CONCAT > OUTPUT_FILE
Run Code Online (Sandbox Code Playgroud)

  • `more <FILES> | cat` (4认同)

kev*_*inf 15

find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'
Run Code Online (Sandbox Code Playgroud)

这将打印完整的文件名(包括路径),然后打印文件的内容.它也非常灵活,因为你可以使用-name"expr"作为find命令,并在文件上运行任意数量的命令.

  • 与“grep”结合起来也非常简单。与 `bash` 一起使用:`find . -type f -print | grep 模式 | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; 猫 {}; 回声'` (2认同)

kva*_*our 6

缺少的 awk 解决方案是:

$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *
Run Code Online (Sandbox Code Playgroud)


小智 5

这就是我通常处理格式的方式:

for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;
Run Code Online (Sandbox Code Playgroud)

我通常将 cat 输入 grep 以获取特定信息。

  • 这里要小心。`for i in *` 不包含子目录。 (3认同)

ch3*_*v3k 5

我喜欢这个选项

for x in $(ls ./*.php); do echo $x; cat $x | grep -i 'menuItem'; done
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
            $('#top-nav-scroller-pos-<?=$active**MenuItem**;?>').addClass('active');
            gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = '0';
        $active**MenuItem** = '1';
        $active**MenuItem** = '2';
        $active**MenuItem** = '3';
./Waiting-Overlay.php
./Yandex.Metrika.php
Run Code Online (Sandbox Code Playgroud)