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

rsync 没有缩写输出的选项,您需要使用正则表达式(或split()

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.splitwithmaxsplit参数来丢弃前 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 回答