如何按日期顺序连接给定目录中的所有文件,我希望将最新文件放在顶部?


18

底部是否有最旧的文件?

另外,如果我这样做,是否还可以剥离每个HTML文件中包含的冗余标头?我看到自己串联了许多HTML文件,最好稍微减少最终文件的文件大小。

Answers:


33

串联使用的文件

cat file1 file2 file3 ...

要获取按时间排序的引用文件名列表,最新的优先,请使用

ls -t

放在一起

cat $(ls -t) > outputfile

您可能想给ls(例如*.html)一些参数。

但是,如果文件名中带有空格,则无法使用。My file.html将假定为两个文件名:Myfile.html。您可以ls对文件名加上引号,然后使用xargs了解引号的参数将参数传递给cat

ls -tQ | xargs cat

至于第二个问题,过滤掉文件的部分并不困难,但这取决于您要删除的内容。什么是“冗余标头”?


这在我的debian系统上不起作用...我必须使用cat $(ls -t) > outputfile,否则将cat拒绝引用的文件名
Mike Pennington 2012年

1
我的错。我总是被这些事情困扰。查看最新答案。
安格斯2012年

哦-多余的标头是指通常放在header.php / footer.php文件中的内容,但是当保存为HTML时它们会分别保存(在批量下载PHP页面时确实会增加文件的大小)。
InquilineKea 2012年

cat $(ls -t)还容易扩展文件名。如果文件名带有*,或?或方括号表达式(例如file-[old].html);并且被解释为模式的文件名是否与其他文件名匹配;该方法将产生不正确的列表。set -f将解决这一缺陷。
赤脚IO

ls -Q可能产生不适合的输出xargs。例如,"foo"变为"\"foo\"",但xargs不能理解双引号字符串中的转义双引号。
赤脚IO

2

以字典顺序以外的其他顺序列出文件的最简单方法是使用zsh glob限定符。如果没有zsh,则可以使用ls,但是解析输出ls会带来危险

cat *(om)

如果要删除某些行,请使用sed或awk或perl。例如,假设<head>第一个文件<body>中的<body></body>标记单独位于一行中,则从第一个文件中提取并合并其他文件中的部分:

{
  sed -e '/<\/body>/ q' *.html(om[2])
  sed -e '1,/<body>/ d' -e '/<\/body>/,$ d' *.html(om[3,-1])
  echo '</body>'
  echo '</html>'
} >concatenated.html

说明:

  • 首先,concatenated.html创建。因此,它是最年轻的*.html文件(假设没有文件具有将来的日期。
  • 然后从第二小的*.html文件复制,但在该</body>行退出。
  • 然后从其他文件复制,但是将所有内容都跳过到该<body>行并从该</body>行开始。
  • 最后产生最后的结束标签。

1

@angus给出的解决方案很好,但是如果文件夹中有目录,它将解决问题。

cat $(ls -tpa | grep -v / )


警告:正如我对安格斯答案的评论中所述,此答案也容易受到路径名扩展的影响。
赤脚IO

除非测试cat的退出状态,否则目录参数应该无关紧要。cat只会向stderr发出一条消息,然后继续执行下一个参数。
赤脚IO
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.