我有...
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 或其他内容。