用于将一系列文件连接在一起的命令

用于将一系列文件连接在一起的命令

我有...

me@computer:~/gutenberg/euclid$ ls

book01.html book04.html book07.html book10.html book13.html book02.html book05.html book08.html book11.html book03.html book06.html book09.html book12.html

我想将所有这些 .html 文件按顺序加入到同一个大文件中。我可以使用什么命令或命令序列?

答案1

在这种特殊情况下cat book??.html > book.html,如果您不关心正确的 HTML 格式,则可以正常工作。

对于更一般的情况,假设您有“book1.html”而不是“book01.html”,“book2.html”而不是“book02.html”等等。文件名的词法排序与逻辑排序不同。你可以这样做:

(echo book?.html | sort; echo book??.html | sort) | xargs cat > book.html

所以一般来说:script_generating_file_names_in_order | xargs cat > all_one_file

这个习语可以大有帮助。

答案2

我购买了关于头/尾的评论,并有一个解决方案,按数字排序,没有 xargs/sort/echo 的东西。

cat book{01..12}.html book-all.html

答案3

如果您使用 GNU 排序,您可以使用sort -V按正确的顺序对名称进行排序:

$ echo -e "book4\nbook2\nbook17\nbook12" |排序-V
书2
书4
书12
书17

这适用于任意数量的文件:

ls book*.html | sort -V | xargs cat > allbooks.html

答案4

如果您的浏览器允许,简单的解决方案可能会起作用。

cat book[0-9]*.html > book.html

当然,你可以四处剥离一些东西,以便可能稍微合法一些:

perl -e 'undef($/); for($x=0;$x<=$#ARGV;$x++) { open(X,"<",$ARGV[$x]); $_ = <X>; close(X); s/.*<body[^>]*>//s unless ($x == 0);  s|</body>|| unless ($x == $#ARGV); print;' book[0-9]*.html > book.html

但这并不能保证您真的拥有所需的一切,如果章节有不同的样式或 JavaScript 或其他内容。

相关内容