Forループを使用してビデオファイルをコマンドラインからx回複製しようとしましたが、次のようにしてみましたが、機能しません。
for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
シェルコードには2つの問題があります。
echo
があってはなりません。$i
は、宛先ファイル名で$1
として誤って入力されています。ファイル自体と同じディレクトリにファイルのコピーを作成するには、次のコマンドを使用します。
cp thefile thecopy
あなたがそこに何か他のものを挿入した場合、例えば.
cp thefile theotherthing thecopy
次に、thefile
とtheotherthing
をthecopy
と呼ばれる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コピーで機能しますが、数千のコピーでは「引数リストが長すぎます」エラーが発生する可能性があります。その場合は、ループの使用に戻ります。
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
短くて正確
< 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
以下のコマンドは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
コピー中に変数iを呼び出していません
以下のスクリプトを使用してください。テストしたように、それはうまくいきました
for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done