次の3つのテキストファイルがあります。
#1.txt
hey stackoverflow
#2.txt
hey stackexchange
#3.txt
hello world
私はこのコマンドを使って私のディレクトリの最後の3つのファイルをリストし、それをリストし、cat
3つのファイルのすべての出力をファイル(all.txt
)に保存します。
注文する:
ls -alth *txt | head -3 | xargs -n1 cat
出力をファイルにリダイレクトするにはどうすればよいですか?
答え1
-l
(長いリスト用)オプションを使用することはls
ここでは意味がありません。ファイル名のみが必要なためです(-h
(レポートサイズのGNU拡張と同じ)人類形式)は次のようになります)。
使用されるxargs
デフォルトの分割ls
も正しくありません。スペース、改行、引用符、バックスラッシュなどを含むファイル名を壊すことができるからです。
このオプションを使用することも意味がありません。シェルは代わりに-a
ここでglobを拡張してファイルのリストを計算し、glob拡張にはデフォルトで隠しファイルが含まれていないためです。*txt
ls
(最近の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
--
オプションの終わりを表示するため、またはで始まるファイル名は-
オプションとは見なされません。ls
cat
または、すべてのシステムでbashの代わりにzshを使用してください。
set -o extendedglob
cat -- (^all.)txt(-.om[1,3]) > all.txt
どこ:
^x
zshは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
)