コマンドシェルでファイルをx回繰り返します。

コマンドシェルでファイルをx回繰り返します。

forループを使用してコマンドラインからビデオファイルをx回コピーしようとしています。次のようなことを試しましたが、うまくいきません。

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

答え1

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

  1. echoそこにはいけません。
  2. ターゲットファイル名の変数$i("dollar i")が("dollar one")として誤って入力されました。$1

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

cp thefile thecopy

次のように複数のパラメータを使用する場合

cp thefile theotherthing thecopy

もしそうなら推定thefileコピーしてtheotherthing入力したいですか?目次呼ぶthecopy

あなたの場合は、cp test.ogg echo "test$1.ogg"具体的に名前付きファイルを探し、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個のレプリカで動作する可能性が高いですが、何千ものレプリカに対して「パラメータリストが多すぎます」というエラーが発生する可能性があります。この場合はループ使用に戻してください。

答え2

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

答え3

短くて正確

< 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

答え4

コピー時に変数iは呼び出されません。

以下のスクリプトを使用してください。テスト後の効果はとても良いです

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

関連情報