gpt4 book ai didi

file - rsync 获取仅包含文件名的列表

转载 作者:行者123 更新时间:2023-12-04 02:08:15 25 4
gpt4 key购买 nike

这是我正在使用的命令的示例:

rsync --list-only --include "*2012*.xml" -exclude "*.xml" serveripaddress::pt/dir/files/ --port=111 > output.txt

如何获得仅列出文件名而没有权限、时间戳等额外信息的列表?

编辑:是否可以在新行上输出每个文件名?

最佳答案

希望问题能移到合适的网站,我还是会在这里回答。

你可以用 awk 附加一个管道:

rsync ... | awk '{ $1=$2=$3=$4=""; print substr($0,5); }' >output.txt

这通过输出第 5 个字段中的所有内容来消除所有不需要的信息,但仅当输出格式中的前四个字段都没有在某处获得额外的空格时才有效(这不太可能)。

awk如果文件名以空格开头,解决方案将不起作用。

一个更强大的解决方法可能是一个相当复杂的程序,它也会做出假设。

它是这样工作的:对于每一行,
  • 截断前 10 个字节。验证它们后面是否有多个空格。也把它们剪掉。
  • 截掉所有后面的数字。验证它们后跟一个空格。把它也剪掉。
  • 切断接下来的 19 个字节。验证它们是否包含适当格式的日期和时间戳。 (我不知道为什么日期的组件用 / 而不是 - 分隔 - 它不符合 ISO 8601 。)
  • 验证现在后面跟着一个空格。把它也剪掉。保留所有后续空白字符不变,因为它们属于文件名。
  • 如果测试通过了所有这些验证,则该行的其余部分可能会包含文件名。


  • 更糟糕的是:对于非常深奥的极端情况,还有更多需要注意的事情:文件名可以被转义。某些不可打印的字节被转义序列替换( #oooooo 是它们的八进制代码),这是一个必须反转的过程。

    因此, awk也不是简单的 sed如果我们想正确地执行,脚本将在此处执行。

    相反,可以使用以下 Python 脚本:
    def rsync_list(fileobj):
    import re
    # Regex to identify a line
    line_re = re.compile(r'.{10} +\d+ ..../../.. ..:..:.. (.*)\n')
    # Regex for escaping
    quoted_re = re.compile(r'\\#(\d\d\d)')
    for line in fileobj:
    match = line_re.match(line)
    assert match, repr(line) # error if not found...
    quoted_fname = match.group(1) # the filename part ...
    # ... must be unquoted:
    fname = quoted_re.sub( # Substitute the matching part...
    lambda m: chr(int(m.group(1), 8)), # ... with the result of this function ...
    quoted_fname) # ... while looking at this string.
    yield fname

    if __name__ == '__main__':
    import sys
    for fname in rsync_list(sys.stdin):
    #import os
    #print repr(fname), os.access(fname, os.F_OK)
    #print repr(fname)
    sys.stdout.write(fname + '\0')

    这输出了由NUL字符分隔的文件名列表,类似于 find -print0的方式以及许多其他工具的工作原理,即使包含换行符(有效!)的文件名也能正确保留:
    rsync . | python rsf.py | xan -0 stat -c '%i'

    正确显示每个给定文件的 inode 编号。

    当然,我可能错过了我没有想到的一个或其他极端情况,但我认为该脚本正确地处理了大多数情况(我测试了所有 255 个可能的一字节文件名以及以开头的文件名空间)。

    关于file - rsync 获取仅包含文件名的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102313/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com