web-dev-qa-db-ja.com

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

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

また、これを行うと、各HTMLファイルに含まれている冗長なヘッダーを取り除くこともできますか?自分で多くのHTMLファイルを連結しているように見えるので、最終的なファイルのファイルサイズを少し小さくするといいでしょう。

18
InquilineKea

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

cat file1 file2 file3 ...

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

ls -t

すべてを一緒に入れて、

cat $(ls -t) > outputfile

lsにいくつかの引数を与えることができます(例:*.html)。

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

ls -tQ | xargs cat

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

34
angus

辞書式以外の順序でファイルをリストする最も簡単な方法は、zsh glob qualifiers を使用することです。 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>行から始めます。
  • 最後に最後の終了タグを生成します。

@angusによって与えられた解決策は良いですが、フォルダ内にディレクトリがある場合は問題を解決します。

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

1