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

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

一番古いファイルが下になるのですか?

また、これを行うと、各 HTML ファイル内に含まれる冗長なヘッダーを削除することもできますか? 多くの HTML ファイルを連結することになると思いますが、最終的なファイルのファイル サイズを少し小さくできればよいと思います。

答え1

ファイルを連結するには

cat file1 file2 file3 ...

引用符で囲まれたファイル名のリストを時間順に新しい順に表示するには、次のようにします。

ls -t

すべてを一緒に入れて、

cat $(ls -t) > outputfile

にいくつかの引数を与える必要があるかもしれませんls(例: *.html)。

しかし、ファイル名にスペースが含まれている場合、これは機能しません。は、と のMy file.html2 つのファイル名であると想定されます。でファイル名を引用符で囲み、引用符を理解する を使用して、引数を に渡すことができます。Myfile.htmllsxargscat

ls -tQ | xargs cat

2 番目の質問については、ファイルの一部をフィルタリングすることは難しくありませんが、具体的に何を除去したいかによって異なります。「冗長ヘッダー」とは何でしょうか?

答え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>
  • 最後に最後の終了タグを生成します。

答え3

@angus が提示した解決策は良いのですが、フォルダー内にディレクトリがある場合は問題が発生しますが、これで解決します。

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

関連情報