1

Django/Python で rsync --list-only コマンドを使用しています。

subprocess.Popen(['rsync', '--list-only', source],
                           stdout=subprocess.PIPE, 
                           env={'RSYNC_PASSWORD': password}).communicate()[0]

次のような結果が返されました。

drwxrwxrwx 4096 2012/11/07 09:56:23 upload

すべてのファイル情報は必要ありません。次のようにファイル名のみを表示したい:

upload

どうやってやるの?ありがとう

4

2 に答える 2

1

split()rsync には出力を短縮するオプションがありません。正規表現 (または)を使用する必要があります。

import re
retval = subprocess.Popen(['rsync', '--list-only', source],
                           stdout=subprocess.PIPE, 
                           env={'RSYNC_PASSWORD': password}).communicate()[0]
retval = re.sub('^.+?\d+:\d+:\d+\s+(\S+.+)', '\g<1>', retval)

または(ファイル名にスペースが含まれていない限り)...

retval = subprocess.Popen(['rsync', '--list-only', source],
                           stdout=subprocess.PIPE, 
                           env={'RSYNC_PASSWORD': password}).communicate()[0]
retval = retval.split(' ')[-1]
于 2012-11-19T10:12:53.957 に答える
0

引数とともに使用str.splitしてmaxsplit、最初の4つのフィールドを破棄できます。例えば

>>> "drwxrwxrwx 4096 2012/11/07 09:56:23 upload".split(None, 4)[-1]
'upload'
>>> "drwxrwxrwx 4096 2012/11/07 09:56:23 doc with spaces.txt".split(None, 4)[-1]
'doc with spaces.txt'

None空白を意味する区切り文字として使用されます。

あなたの場合、rsyncコマンドが複数のファイルを返す可能性があると仮定して、次のことを試すことができます。

# retrieve output
out = subprocess.Popen(['rsync', '--list-only', source],
                       stdout=subprocess.PIPE, 
                       env={'RSYNC_PASSWORD': password}).communicate()[0]
# parse block of text into list of strings
lines = (x.strip() for x in out.split('\n'))
# take only filenames (ignoring empty lines)
filenames = [x.split(None, 4)[-1] for x in lines if x]
于 2012-11-19T10:27:33.580 に答える