複数ファイルのxargs出力を1つのファイルとして保存

複数ファイルのxargs出力を1つのファイルとして保存

次の3つのテキストファイルがあります。

#1.txt
hey stackoverflow
#2.txt   
hey stackexchange
#3.txt
hello world

私はこのコマンドを使って私のディレクトリの最後の3つのファイルをリストし、それをリストし、cat3つのファイルのすべての出力をファイル(all.txt)に保存します。

注文する:

ls -alth *txt | head -3 | xargs -n1 cat

出力をファイルにリダイレクトするにはどうすればよいですか?

答え1

-l(長いリスト用)オプションを使用することはlsここでは意味がありません。ファイル名のみが必要なためです(-h(レポートサイズのGNU拡張と同じ)人類形式)は次のようになります)。

使用されるxargsデフォルトの分割lsも正しくありません。スペース、改行、引用符、バックスラッシュなどを含むファイル名を壊すことができるからです。

このオプションを使用することも意味がありません。シェルは代わりに-aここでglobを拡張してファイルのリストを計算し、glob拡張にはデフォルトで隠しファイルが含まれていないためです。*txtls

(最近のGNUシステムとGNUシェルから)必要なものは次のとおりです。

shopt -s extglob
ls -Ltd --zero -- !(all.)txt | head -zn3 | xargs -r0 cat -- > all.txt

dotglob隠しファイルを検討したい場合は、このオプションを設定することもできます)。

次に追加:

  • -Lシンボリックリンクタイプのファイルのlsシンボリックリンクターゲットの変更時間を考慮するオプション
  • -dなぜなら、これらのファイルのいくつかが次の種類の場合目次ls、内容をリストしたくありません。
  • --zero// NULで区切られたレコードを処理します。 NULはファイルパスには現れない唯一の文字です-z-0
  • !(all.)txtリストに含まれないよう*txtにする代わりに、ディスクがいっぱいになる無限ループが発生する可能性があります。all.txt
  • -rファイルが見つからない場合に実行をxargs防ぐオプションです。cat
  • --オプションの終わりを表示するため、またはで始まるファイル名は-オプションとは見なされません。lscat

または、すべてのシステムでbashの代わりにzshを使用してください。

set -o extendedglob
cat -- (^all.)txt(-.om[1,3]) > all.txt

どこ:

  • ^xzshはkshと同じです!(x)(bashはオプションでkshの拡張glob演算子のサブセットをサポートしますextglob)。
  • -等しい-L
  • .限られた定期的なディレクトリ、fifo、デバイス以外のファイル(または一般ファイルへのシンボリックリンク)...
  • om-t修正時間に基づいてソートするのと同じです。
  • [1,3]たとえば、head -zn3最初の3つに制限があります。
  • globがファイルと一致しない場合、コマンドは実行されず、エラーが返されます(上記のbashコマンドはall.txt生成または切り捨てられません)。

ファイルを非表示と見なすには、次を追加します。D グローバル予選( cat -- (^all.)txt(D-.om[1,3]) > all.txt)

関連情報