各行にデータファイルダウンロードコマンドを実行する「コマンド」テキストファイルがあります。コマンドファイルをbashに送信します。しかし、少数のダウンロードは失敗します。欠落している項目を見つけるために使用するアルゴリズムは次のとおりです。
- ダウンロード後にコマンドファイルに戻り、ダウンロードした各ファイルが存在することを確認します。
- ダウンロードがない場合は、コマンドラインを新しいコマンドファイルにコピーします。
- 残りのダウンロードのために新しいコマンドファイルを残しました。
以下は、アルゴリズムを実装するbashスクリプトです。
1 #!/bin/bash
2 while read line
3 do
4 for item in $line
5 do
6 if [[ $item == *out_fname* ]]; then
7 splitline=(${item//=/ })
8 target_file=${splitline[1]}
9 if [ ! -f $target_file ]; then
10 echo $line >> stillneed.txt
11 fi
12 fi
13 done
14 done < "$@"
Q:これはうまく機能しますが、より良いアルゴリズムや実装があります(おそらくbash以外のものを使用することもできます)。私がしたことは、人間がしなければならないことをbashに任せることだけでした。しかし、Unixは常に仕事を処理するより良い方法を持っているようです...
ベストアンサー1
「out_fname」だけでなく、「out_fname=」を探しているようです。
私はawkとshellを混ぜて使用するか、Pythonを使用します。 awk/シェルから:
awk '{for(i=0;i<NF;i++) {if (index($i, 'out_fname=')) {split($i,A,/=/);print A[i]}}' "$@" |
while read filename; do
if [ ! -f $filename ]; then echo $filename; fi
done > stillneed.txt
Pythonでは:
import fileinput, os
stillneed = open("stillneed.txt", "w")
for line in fileinput.input():
for filename in [l.split('=')[1] for l in line.split() if l.find('out_fname=')!=-1]:
if not os.path.exists(filename):
print >>stillneed, filename