web-dev-qa-db-ja.com

コマンドシェルでファイルをx回複製する

Forループを使用してビデオファイルをコマンドラインからx回複製しようとしましたが、次のようにしてみましたが、機能しません。

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
24
Black

シェルコードには2つの問題があります。

  1. echoがあってはなりません。
  2. 変数$iは、宛先ファイル名で$1として誤って入力されています。

ファイル自体と同じディレクトリにファイルのコピーを作成するには、次のコマンドを使用します。

cp thefile thecopy

あなたがそこに何か他のものを挿入した場合、例えば.

cp thefile theotherthing thecopy

次に、thefiletheotherthingthecopyと呼ばれるdirectoryにコピーするとします。

あなたの場合、test.oggという名前のファイルとechoという名前のファイルを具体的に探して、test$1.oggディレクトリにコピーします。

$1はおそらく空の文字列に展開されます。このため、コマンドからechoを削除すると、「test.oggとtest.oggは同じファイルです」と表示されます。実行されるコマンドは本質的に

cp test.ogg test.ogg

これはおそらくタイプミスです。

最終的には、次のようなものが必要になります。

for i in {1..100}; do cp test.ogg "test$i.ogg"; done

または、代替として

i=0
while (( i++ < 100 )); do
  cp test.ogg "test$i.ogg"
done

または、teeを使用します。

tee test{1..100}.ogg <test.ogg >/dev/null

注:これはほとんどの場合100コピーで機能しますが、数千のコピーでは「引数リストが長すぎます」エラーが発生する可能性があります。その場合は、ループの使用に戻ります。

28
Kusalananda
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
13
coffeMug

短くて正確

< test.ogg tee test{1..100}.ogg

またはさらに良いこと

tee test{1..100}.ogg < test.ogg >/dev/null

詳細は teeコマンドの使用法 を参照してください。

更新

@Gillesによって提案されているように、teeを使用すると、ファイルのメタデータが保持されないという欠点があります。その問題を克服するには、その後、以下のコマンドを実行する必要がある場合があります。

cp --attributes-only --preserve Source Target
12
Rahul

以下のコマンドはfile.a 5回コピーします:

$ seq 5 | xargs -I AA cp file.a fileAA.a

Ddを好む場合(cpと同じではありません!):

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a
1
cy8g3n

コピー中に変数iを呼び出していません

以下のスクリプトを使用してください。テストしたように、それはうまくいきました

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done
0