リストに基づいてファイルが存在することを確認します。

リストに基づいてファイルが存在することを確認します。

各行にデータファイルダウンロードコマンドを実行する「コマンド」テキストファイルがあります。コマンドファイルをbashに送信します。しかし、少数のダウンロードは失敗します。欠落している項目を見つけるために使用するアルゴリズムは次のとおりです。

  1. ダウンロード後にコマンドファイルに戻り、ダウンロードした各ファイルが存在することを確認します。
  2. ダウンロードがない場合は、コマンドラインを新しいコマンドファイルにコピーします。
  3. 残りのダウンロードのために新しいコマンドファイルを残しました。

以下は、アルゴリズムを実装する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

おすすめ記事