コマンドラインを使用して単一ファイルの複数のコピーを作成する代替ソリューションは何ですか?

コマンドラインを使用して単一ファイルの複数のコピーを作成する代替ソリューションは何ですか?

1つのファイルを10のファイルにコピーしようとしています。たとえば、という電子メールがありますtest1.eml。同じファイルのコピーが10個必要です。

インターネットで検索中にこのstackoverflowスレッドが見つかりました。https://stackoverflow.com/questions/9550540/linux-commands-to-copy-one-file-to-many-filesそして、コミュニティメンバーの一人が「knittl」と言った評価コマンドに従ってください。

eval 'cp test1.eml 'test{2..10}.eml';'

上記のコマンドは機能し、私の要件を満たしています。 evalコマンドに言及した人が私に汚いハッキングだと言ったので、これを達成するための代替/よりエレガントなコマンドはありますか?

答え1

私は似たようなことをしますが、for i in {2..10}; do cp test1.eml test$i.eml; done
ほぼ同じことをします。

答え2

 tee >test2.eml test{3..10}.eml < test1.xml

ソースコードは一度だけ読み取られ、1つのコマンドのみが実行されます。大容量ファイルの場合、効率が悪くなり、teeデータブロックが各出力ファイルに順番に書き込まれるため、断片化が発生する可能性があります。また、cpオプションに従って元の権限を部分的または完全にコピーするのではなく、現在のumaskに基づいて権限を持つファイルを作成します。

入力を保存するにはzshシェルを使用してください。 (ところで、この{2..10}構文はここから来ています。)

 for f (test{2..10}.eml)cp test1.eml $f

これはあなたと同じくらい短いです:

 eval 'cp test1.eml 'test{2..10}.eml';'

ただし、より問題のある文字を含むファイル名を使用すると、より直感的で明確で一般化するのが簡単です。

zshこのオプションを無効にしていない場合は、次のこともmultiosできます。

<test1.eml >test{2..10}.eml

そこでzsh内部タスクが実行され、tee呼び出されるため、catその方法よりもやや効率が低くなりますtee

関連情報