特定のディレクトリ内のすべてのファイルを日付順に連結するにはどうすればよいですか?最新のファイルが一番上にある必要がありますか?


18

そして、一番古いファイルが一番下にありますか?

また、これを行うと、各HTMLファイルに含まれる冗長ヘッダーを削除することもできますか?私は自分自身が多くのHTMLファイルを連結しているのを見ています、そして最終的なファイルのファイルサイズを少し減らすといいでしょう。

回答:


33

使用するファイルを連結するには

cat file1 file2 file3 ...

時間でソートされた引用符で囲まれたファイル名のリストを取得するには、最新のものを最初に使用します。

ls -t

すべてを一緒に入れて、

cat $(ls -t) > outputfile

ls(例えば*.html)にいくつかの引数を与えたいかもしれません。

ただし、スペースを含むファイル名がある場合、これは機能しません。My file.htmlは2つのファイル名と見なされます:Myfile.htmllsファイル名を引用符で囲んでから、引用符xargsを理解しているを使用して、引数をに渡すことができますcat

ls -tQ | xargs cat

2番目の質問については、ファイルの一部を除外することは難しくありませんが、何を削除するかによって異なります。「冗長ヘッダー」とは何ですか?


これは私のdebianシステムでは動作しません...を使用する必要がありますcat $(ls -t) > outputfile。そうでない場合cat、引用されたファイル名を拒否します
Mike Pennington

1
私の間違い。私は常にこれらのことに巻き込まれます。更新された回答を参照してください。
アンガス

ああ-冗長なヘッダーとは、通常、header.php / footer.phpファイルに置かれているものを意味しますが、HTMLに保存すると個別に保存されます(PHPページを大量にダウンロードすると、ファイルサイズが大きくなります)。
InquilineKea

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ファイルです(将来の日付を持つファイルがないと仮定します)。
  • 次に、2番目に新しい*.htmlファイルからコピーしますが、その</body>行で終了します。
  • 次に、他のファイルからコピーしますが、その<body>行まですべてをスキップし、その行から始め</body>ます。
  • 最後に、最後の終了タグを生成します。

1

@angusが提供する解決策は適切ですが、フォルダー内にディレクトリがある場合は問題があります。これにより修正されます。

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


警告:この答えは、アンガスの答えに対する私のコメントで説明されているように、パス名の展開に対しても脆弱です。
裸足IO

catの終了ステータスがテストされない限り、ディレクトリ引数は重要ではありません。catは単にstderrにメッセージを送信し、次の引数に進みます。
裸足IO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.