一連のファイルを一緒にリンクするコマンド

一連のファイルを一緒にリンクするコマンド

私は持っています...

私@コンピュータ:〜/グーテンベルク/ユークリッド$ 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形式を気にしないと正常に動作します。

より一般的なケースでは、「book01.html」の代わりに「book1.html」、「book02.html」の代わりに「book2.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

私はhead / tailに関するコメントを聞き、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などが異なる場合、必要なものがすべてあるという保証はありません。

関連情報