forループを使用してコマンドラインからビデオファイルをx回コピーしようとしています。次のようなことを試しましたが、うまくいきません。
for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
答え1
シェルコードには2つの問題があります。
echo
そこにはいけません。- ターゲットファイル名の変数
$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