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


22

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

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

5
あなたの唯一のエラーは、echoそこにあるべきではない、そして$1あるべきではありません$iか?
ジュリーペレティエ

エコーを削除してのみ使用するとtest$1.oggtest.oggとtest.oggは同じファイルなので、$ 1が認識されないようです?
ブラック

@EdwardBlack:私はあなたの要求を誤解したように聞こえます。その解決策は適切ではありません。
クオンルム

@JuliePelletier、いまいましい、偶然に私が$1代わりに書くことは時々起こります$i、それは朝に早いです、ごめん...ありがとうございます。$x代わりに将来的に使用します$i
ブラック

回答:


25

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

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

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

cp thefile thecopy

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

cp thefile theotherthing thecopy

あなたがコピーしたいことが想定されるthefiletheotherthingディレクトリと呼ばれますthecopy

あなたの場合、それは具体的に呼ばれるファイルとディレクトリにコピーするtest.ogg名前のファイルを探します。echotest$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コピーで機能しますが、数千コピーでは「引数リストが長すぎます」エラーが生成される可能性があります。その場合は、ループの使用に戻ります。


12

短く正確

< 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

3
これは、複数の呼び出しよりも潜在的に高速ですcp(使用可能なメモリに対するファイルサイズに依存します)が、ファイルメタデータを保持しないという欠点があります。
ジル 'SO-悪であるのをやめる'

@Gillesああ、それを克服できますか?
ラーフル

3
cp --attributes-onlyその後実行できます。
ジル 'SO-悪であるのをやめる'

@Gillesありがとう、あなたの助けに従って私の答えを更新しました。
ラーフル

FWIW cp -pメタデータを保持するために使用される他の回答もありません。
ロアイマ


1

次のコマンドは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

0

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

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

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

3
これは、(1)質問で約100を要求し、あなたの答えが10を使用すること、(2)に-rvfオプションを不必要に追加したことcp、(3)変数展開の引用に失敗したことを除いて、前の2つの回答とコメントと同じです。(また;、次のような句読記号の間にスペースを置くのが一般的であることに注意してください。)-pオプションの追加は価値がありますが、(4a)既に(コメントで)対処されており、(4b)あなたの答えはありませんあなたが何をしているのか説明しなければ役立つ。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.