変数リストで、変数と呼ばれるファイルを追加して作成します。

変数リストで、変数と呼ばれるファイルを追加して作成します。

HPCクラスタを使用してかなり大きな(〜3GB)ファイルバッチをダウンロードするために、複数の「wget」シェルスクリプトを作成したいと思います。ファイル名は次のように filenames.txt に保存されます。

$cat filenames.txt
file1
file2
file3
...

私が取得したいURLは次のように構成されています。

ftp://host.com/dir1/dir2/file1/file1.sra
ftp://host.com/dir1/dir2/file2/file2.sra
ftp://host.com/dir1/dir2/file3/file3.sra

各wgetのシェルスクリプトを生成し、それを変数自体というファイルに書きたいと思います。たとえば、file1.sh には以下を含める必要があります。

#!/bin/bash
wget ftp://host.com/dir1/dir2/file1/file1.sra

そして、file2.shには次のものを含める必要があります。

#!/bin/bash
wget ftp://host.com/dir1/dir2/file2/file2.sra

ご覧のとおり、一致するパターンは、1)URLと2)作成するファイル名です。ファイル名にURLを「追加」してから、その名前を付けた.shファイルに書き込むにはどうすればよいですか?

ベストアンサー1

これを行うには、非常に単純なシェルループを作成できます。

while read filename
do
    echo '#!/bin/bash' > $filename.sh
    echo "wget ftp://host.com/dir1/dir2/$filename/$filename.sra" >> $filename.sh
done < filenames.txt

これは各行を読み取り、filenames.txt呼び出してから、各行に置き換えられたファイルの行に名前が付けられたfilenameファイルを作成します。ファイルには2行があります。各ファイルに、必要なコマンド(再度ファイル名を.に置き換えます)は上書きするのではなく、同じファイルに2行目を追加します。このスクリプトを実行した後:$filename.sh$filename#!/bin/bashwget>>

$ cat file1.sh 
#!/bin/bash
wget ftp://host.com/dir1/dir2/file1/file1.sra
$ cat file2.sh
#!/bin/bash
wget ftp://host.com/dir1/dir2/file2/file2.sra

ループ本体の内側に3行目を追加できます。

chmod a+x "$filename.sh"

その後、スクリプトを実行可能にします。行のすぐ上に置きますdone


ファイル名にスペースやその他の特殊文字が含まれていると、さまざまなレベルで問題が発生しますが、英数字名の場合はうまく機能します。

おすすめ記事