1

rsyncを使用してファイルを自宅のPCにプッシュバックするために使用するスクリプトがあります。正常にプッシュされたファイル名はsqliteデータベースに追加されるため、再度プッシュされることはありません(1面ミラーのみが必要なため)。とにかく、私が抱えている問題は、スクリプトが再帰的にソースパスをたどり、定義された拡張子に基づいてファイルをプッシュするにもかかわらず、ファイルが同じ宛先ルートディレクトリをたどるということです。

私がしようとしているのは、宛先フォルダーの構造をソースと同じにすることです。

destDirパスに何かを追加する必要があると思いますが、正確にはわかりません。

for root, dirs, files in os.walk(sourceDir):
   for file in files:
     //If some filtering criteria
     print("Syncing new file: "+file)
     cmd=["rsync"]
     cmd.append(os.path.join(root, file))
     cmd.append(destDir+ "/")
     p=subprocess.Popen(cmd,shell=False)
 if p.wait()==0:
  rememberFile(file)
4

1 に答える 1

0

rsyncPythonで再実装するのではなく、このための機能にできるだけ依存する必要があると思います。rsync広範囲にテストされており、フル機能を備えています。彼らはあなたが遭遇しているすべてのバグを修正しました。たとえば、元のコードスニペットでは、(ファイル名だけでなく)ファイルのフルパスを再構築し、それをに追加する必要がありますdestDir

ただし、デバッグを続ける前に、この代替案を検討してください。sql dbの代わりに、プッシュしたすべてのファイルをプレーンテキストファイルに保存してみませんか?それがと呼ばれているとしましょうexclude_list.txt。次に、ワンライナーrsyncコマンドは次のとおりです。

rsync -r --exclude-from 'exclude_list.txt' src dst

スイッチにより、-rファイルツリーが自動的にトラバースされます。この構文の詳細については、このページのトピック#6を参照してください。

これで、を維持するために必要なのはPythonスクリプトだけですexclude_list.txt。私は2つのオプションを考えることができます:

  • 移動されたファイル名を一覧表示し、それらを解析して、に追加するオプションをrsync使用して、の出力をキャプチャします。これが最もエレガントなソリューションだと思います。あなたはおそらくほんの数行でそれを行うことができます。-vexclude_list.txt
  • すでにツリーをトラバースしてすべてのファイルをに追加する必要があるスクリプトを使用しますがexclude_list.txt、個々のrsync呼び出しはすべて削除します。次にrsync、上記のように、最後に1回呼び出します。
于 2013-01-10T10:07:45.830 に答える