【问题标题】:Concatenate all files in folder and subfolder with newline to one file使用换行符将文件夹和子文件夹中的所有文件连接到一个文件
【发布时间】:2021-09-09 06:32:11
【问题描述】:

我有一些带有 .txt 和其他扩展名(如 .py、.html)的文件夹和子文件夹,我想将所有文件夹和子文件夹连接到一个 .txt 文件中

我试试这个:

find . -type f -exec cat {} + > test.txt

输入:

txt1.txt:
aaaaa
test.py
print("a")
htmltest1.html:
<head></head>

输出:

aaaaaprint("a")<head></head>

期望的输出:

aaaaa
print("a")
<head></head>

那么,如何修改这个 bash-command 以获得我想要的输出?我想在每个打印文件后粘贴换行符

【问题讨论】:

  • 如果你认为你给-exec的命令是一个你可以完全控制的脚本——这会有帮助吗? find . -type f -exec myscript {} + &gt; test.txt - 你知道我要去哪里吗? for file in "$@" ...
  • 我刚刚尝试了您的 find 命令,它工作正常,除了我指定了一个目录,而不仅仅是 . 以避免将 test.txt 本身作为输入。我还尝试了find . -name *.txt -exec cat {} \; &gt;all-cat.txt,它提供了相同的结果。无法复制。
  • 可能排除find:find . -type f ! -name 'test.txt' -exec cat {} + &gt; test.txt 中的输出文件,但我无法重现您的输出。可能是文件中的回车。

标签: bash concatenation cat


【解决方案1】:

cat 上使用-E 参数,以便在行尾打印$
然后使用sed 将其去掉,并在末尾使用\$ 符号锚定$

find . -type f -exec cat -E {} + | sed s'/\$$//' > test.txt

【讨论】:

    【解决方案2】:

    问题是文件的最后几行没有以换行符终止,这意味着它们不满足文本文件的 POSIX 定义,这可能会产生类似这样的奇怪结果。

    可能我用过的所有图形文本编辑器都允许你不放一个终止换行符,而且很多人不会放它,大概是因为编辑器让它看起来像结尾有一个多余的空行。 这可能是某些人无法重现您的问题的原因 - 大概他们使用行为良好的工具(例如 catvimnano)创建了示例文件,或者他们确实将换行符放在了末尾.

    那么问题来了:

    user@host:~$ find . -type f -exec cat {} \;
    aaaaaprint("a")<head></head>user@host:~$
    

    为避免将来出现此类问题,在使用图形文本编辑器时,您应该始终在文件中最后一行文本之后点击&lt;enter&gt;。但是,有时您必须使用其他用户生成的文件,而这些用户可能不知道这类东西,所以:
    这是一个快速而肮脏的解决方法(与仅包含换行符的附加文件连接):

    user@host:~$ echo '' > /tmp/newline.txt
    user@host:~$ find . -type f -exec cat {} /tmp/newline.txt \;
    aaaaa
    print("a")
    <head></head>
    user@host:~$
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2011-04-24
      • 2022-01-13
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多