Linux 在Bash中将一个目录中的所有文件连接到一个文件中,并按修改日期排序

Linux 在Bash中将一个目录中的所有文件连接到一个文件中,并按修改日期排序,linux,bash,Linux,Bash,我已经将数千篇纯文本格式的文章移动到一个目录中 在标题中,有些有空格,有些以-,开头,有些有单引号/双引号,基本上所有其他有效的Windows和Linux文件名字符都在标题中 内容文本包含Windows和Linux行结尾(对-这就是它们的名称?) 在Linux/Bash中,如何将所有这些文件(一半没有扩展名,一半是.txt)连接到一个文件中,按修改日期排序,文件名和文件日期整齐地打印在每个文件的内容之前 如果可以的话,请告诉我如何在嵌套的文件结构中也做同样的事情,这次除了文件名和文件修改日期之外

我已经将数千篇纯文本格式的文章移动到一个目录中

在标题中,有些有空格,有些以-,开头,有些有单引号/双引号,基本上所有其他有效的Windows和Linux文件名字符都在标题中

内容文本包含Windows和Linux行结尾(对-这就是它们的名称?)

在Linux/Bash中,如何将所有这些文件(一半没有扩展名,一半是.txt)连接到一个文件中,按修改日期排序,文件名和文件日期整齐地打印在每个文件的内容之前

如果可以的话,请告诉我如何在嵌套的文件结构中也做同样的事情,这次除了文件名和文件修改日期之外,还要为每个文件打印文件路径

我会非常感激,这是我自己多年来的写作,我已经搜索和奋斗了几个小时。我是作家而不是程序员=)

感谢您的考虑。

使用奇妙的答案(避免类似的事情)会让您得到类似的结果(对于单个目录):


编辑:正如在gniourfúgniourf的优秀答案中所注意到的,我没有解释输入文件中不同的行尾。如果您有一些GNU好东西和
dos2unix
,请使用
dos2unix:

find -type f -printf "%T@ %p\0" | sort -nz | while IFS= read -r -d '' l; do f=${l#* }; printf '%s %s\n' "$(date -r "$f")" "$f"; dos2unix < "$f"; echo; done
顺便说一下,内容显示在终端屏幕上。如果要将其重定向到文件
mycatedfile.txt
,则:

find \! -name 'mycatedfile.txt' \! -name '.fuse_hidden*' -type f -printf "%T@ %p\0" | sort -nz | while IFS= read -r -d '' l; do f=${l#* }; printf '%s %s\n' "$(date -r "$f")" "$f"; dos2unix < "$f"; echo; done > "mycatedfile.txt"
find\-名称“mycatedfile.txt”\-名称'.fuse_hidden*'-类型f-printf“%T@%p\0”| sort-nz |而IFS=read-r-d''l;dof=${l#*};printf'%s%s\n'$(日期-r“$f”)“$f”;dos2unix<“$f”;回声;完成>“mycatedfile.txt”

你们太棒了,让我把这个放到我的(离线)写作电脑上。非常感谢,在我能给出一个确认的工作“最佳答案”之前会有一点。嘿,Etan-我复制了这个,但是我得到了'stat:invalid option--'n''作为循环中的一个错误(它被重复了一遍又一遍)-如果我的stat没有-n作为选项,是否有一个解决方法?(我刚刚检查过,我有stat版本8.21,如果有帮助的话)请看这两行上的注释。它们是备用的
stat
call选项。谢谢您的努力,Reisner先生。我做错了吗?它似乎无限期地循环.oh-它本身就包含了.fuse_hiddenblahbahblahblah“temp文件。这就是问题所在。纠正这个/告诉我我做错了什么&我会给出最好的答案。谢谢@拉基托:我不知道为什么会这样。我编辑了这篇文章,加入了忽略这些文件的方法。希望这能有所帮助。@gniourf\u gnurf:不管出于什么原因,最后一个版本没有出现在我面前,但当我只是手动将它导入一个文件(在脚本调用后添加“>>/file/path/here/filenamehere.txt”)时,它运行得非常好。我可能只是打错了,我手动复制了它。无论如何,我会给这个最好的答案
find -type f -printf "%T@ %p\0" | sort -nz | while IFS= read -r -d '' l; do f=${l#* }; printf '%s %s\n' "$(date -r "$f")" "$f"; dos2unix < "$f"; echo; done
find \! -name '.fuse_hidden*' -type f -printf "%T@ %p\0" | sort -nz | while IFS= read -r -d '' l; do f=${l#* }; printf '%s %s\n' "$(date -r "$f")" "$f"; dos2unix < "$f"; echo; done
find \! -name 'mycatedfile.txt' \! -name '.fuse_hidden*' -type f -printf "%T@ %p\0" | sort -nz | while IFS= read -r -d '' l; do f=${l#* }; printf '%s %s\n' "$(date -r "$f")" "$f"; dos2unix < "$f"; echo; done > "mycatedfile.txt"