2016-10-01 13 views
1

rsyncを使用して、自宅のコンピュータからサーバーにファイルを移動します。 grep + globを含むファイルのみのディレクトリを転送して更新するコマンドです。このコマンドは、以下に示すディレクトリ構造のtoplevel/ディレクトリから実行します。Rsync include/excludeがpythonサブプロセスで動作しない

rsync -r --progress --include='**201609*/***' --exclude='*' -avzh files/ [email protected]:/user/files 

ここに私の自宅のファイル上の作業ディレクトリのファイル構造は次のようになります。

- toplevel 
     - items 
     - files 
     - 20160315 
     - 20160910 
      - dir1 
      - really_cool_file1 
     - 20160911 
      - dir2 

これは正常に動作し、[email protected]:/user/files上のファイル構造は、私の自宅のコンピュータ上と同じです。


これを行うためのPythonスクリプトを書きましたが、機能しません。 files/20160315も転送されますが、これは私が望むものではありません。

#!/usr/bin/env python3 
import os 
from subprocess import run 

os.chdir("toplevel") 

command_run = ["rsync", "-r", 
      "--progress", 
      "--include='**201609*/***'", 
      "--exclude='*'", 
      "-avzh", 
      "files/", "[email protected]:/user/files"] 

run(command_run, shell=False, check=True) 

ここでは何が起こっていますか? command_runが文字列だったのと同じ問題がありました。subprocess.run()shell=Trueで渡しました。

+1

引用符は、シェル、ないrsyncのためのもので、コマンドラインで実行しているように見えるために必要なものを教えてくれます。 –

+0

ええ、一重引用符は削除されます。例えば ​​'--include = ** 201609 */***" 'と試してください。 – tdelaney

答えて

1

これらの引用符の一部は、呼び出されたプロセスに渡される前にシェルによって削除されます。デフォルトのshell=Falseでプログラムを呼び出す場合は、これを自分で行う必要があります。この小さなスクリプトは、パラメータが

test.py

#!/usr/bin/env python3 
import sys 
print(sys.argv) 

そして

~/tmp $ ./test.py -r --progress --include='**201609*/***' --exclude='*' -avzh files/ [email protected]:/user/files 
['./test.py', '-r', '--progress', '--include=**201609*/***', '--exclude=*', '-avzh', 'files/', '[email protected]:/user/files'] 
~/tmp $ 
+0

私のスクリプトから一重引用符を取り除いて私のために修正しました!みんな、ありがとう! – conchoecia

関連する問題