2013-10-25 7 views
8

Linuxでbashシェルコマンドとスクリプトを使用する方法を学び始めました。スクリプトで複数のファイルをbashで作成する

ソースファイルを取得するスクリプトを作成し、選択した数の名前付きコピーを作成します。

例えば、私はtestFileとしてソースを持っており、私は15個のコピーを選ぶので、同じ場所にtestFile1,2,3 ... 14,15が作成されます。代わりに、YにXからファイルを作成するしかし、それは(例えば)を持つ1つのファイルだけを作る

for LABEL in {$X..$Y}; do cp $INPUT $INPUT$LABEL; done 

{1 ..:私は、次のコマンドを作るしようとしている、これを試してみて、達成するために

5}の代わりにファイル1,2,3,4,5を追加しました

変数をループの数値として正しく使用するにはどうすれば変更できますか?

+0

関連、かなり重複していない場合。 .. http://stackoverflow.com/questions/14990185/make-multiple-copies-of-files-with-a-shell-script – beroe

答えて

6

brace expansionのメカニズムは少し制限されています。それは変数では機能しません、リテラルだけでは機能しません。何をしたい、あなたはおそらくseqコマンドを持っている、と書くことができますについては

INPUT=testFile 
for num in $(seq 1 15) 
do 
    cp "$INPUT" "$INPUT$num" 
done 
+0

私はそのコマンドを試しましたが、このエラーがありました:./copymany.sh:line 14: $ {seq 1 15}:不正な置換 –

+0

私はあなたのコマンドをそのまま貼り付けるだけで、 "cp: '1'の後に行先ファイルのオペランドが見つからない(そして他の15から15まで)" –

+0

かっこ( '()')を使用しました。初期コードは '{}'中カッコを表示します。あなたは '$ INPUT'がどのように設定されているのかわからなかったので、設定できませんでしたが、' cp'コマンドは数字のみを見ていることを意味します。これは '$ INPUT'がセットされていないことを意味します。これをコードに追加する必要があります。また、ファイル名を二重引用符で囲むこともお勧めです。あなたはおそらく名前にスペースなどがないので、それは重要ではありませんが、おそらく申し訳ありませんより安全であることは容易に間違いありません。 –

2

ループためC-スタイルを使用:

$ x=0 y=15 
$ for ((i=x; i<=y; i++)); do cp "$INPUT" "$INPUT$i"; done 
+0

素晴らしいです、ありがとうございます。手紙(A〜Z)と数字を取るように修正する方法はありますか? –

+0

また、なぜ私はコマンドラインで入力した場合、これは動作しますが、copymany.shというスクリプトとして実行しようとすると、 "cp:can not stat' ':そのようなファイルやディレクトリはありません " –

+0

' {a..z}の私のために。 do ... ... –

関連する問題