将文件夹和子文件夹中的所有文件与换行符连接到一个文件

Concatenate all files in folder and subfolder with newline to one file

我有一些文件夹和子文件夹带有 .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-命令以获得我想要的输出?我想在每个打印文件后粘贴换行符

cat 上使用 -E 参数,以便在行尾打印 $
然后使用 sed 将其剥离,并在末尾使用 $ 锚定的文字 $ 符号。

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

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

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

问题来了:

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

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

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