シェルから一連のファイルに出力する最も簡単なソリューション

シェルから一連のファイルに出力する最も簡単なソリューション

次の一連のファイルを作成できます。

touch file{A..Z}.txt 

それでは、出力をこの範囲に送る最も簡単な解決策は何ですか?

例:echo 'hello, world'{A..Z}

答え1

このコマンドを使用してファイルを生成する場合:

touch file{A..Z}.txt

同じ拡張子を使用して同じテキストを同じように作成して生成できます。

echo hello, world | tee file{A..Z}.txt

このteeコマンドは、次のようにも書き込みます。標準出力したがって、端末に作成されたコピーも受け取ります。/dev/null必要でない場合は、次にリダイレクトしてください。

echo hello, world | tee file{A..Z}.txt >/dev/null

走るman teeローカルシステムのコマンドに関する情報を取得します。たとえば、この-aフラグはファイルセットにテキストを追加します。

bashほとんどの場合、拡張自体はシェルによって実行されます。バラよりman bashもっと学ぶ。

答え2

存在するzsh

echo new test > file{A..Z}.txt

これはmultiosオプションが無効になっていないと仮定します。

実際にfdが書き込みのために何度もリダイレクトされると(、、、、>リダイレクト>>演算子を使用します1<>が、これも適用されます...)、パイプにリダイレクトされ、パイプのもう一方の端に背景zshがあります。同様の方法ですべての宛先にデータを送信するプロセスです。>!>||zshzshtee

オプションnoclobberがオンになっていfileK.txtて、すでに存在している場合は、リダイレクトが中断され、そのコマンドを開く間にコマンドが実行されないため、削除されませんがfileK.txt開かれfileA.txtますfileJ.txt(0サイズで生成されます)。

これらのファイルはすべて同時に開くため、あまりにも多くのファイルにteeリダイレクトすると、開かれたファイル記述子の数の制限に達する可能性があります。

$ echo test > file{A..Z}{A..Z}{A..Z}.txt
zsh: multio failed for fd 3: too many open files
$ echo test | tee file{A..Z}{A..Z}{A..Z}.txt
tee: fileBNH.txt: Too many open files
tee: fileBNI.txt: Too many open files
tee: fileBNJ.txt: Too many open files
[...]
tee: fileZZZ.txt: Too many open files
test

ここでこのようなコマンドを使用すると、echo実行コストがほとんどなく(同様の動作に必要なパイプを生成し、それを介してデータをプッシュするオーバーヘッドよりも少なくなりますtee)、並列ではなくシリアルでファイルを開いて、埋め、閉じることができます。ファイルとしてecho

for f (file{A..Z}.txt) echo new test > $f

答え3

ファイルをすでに作成していて新しいテキストのみを追加したい場合は、-aオプションを指定してteeコマンドを使用できます。

echo "new text" | tee -a file{A..Z}.txt

ファイルの内容(ファイル0など)をファイルに追加するには:

<file0 tee -a file{A..Z}.txt

関連情報