2012-02-01 22 views
9

Dưới đây là một ví dụ về lệnh Tôi đang sử dụng:rsync để có được một danh sách các tên tập tin chỉ

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

Làm thế nào tôi có thể nhận được một danh sách chỉ là tên tập tin mà không có thông tin thêm như quyền, dấu thời gian, v.v.

Chỉnh sửa: Và có thể xuất mỗi tên tệp trên một dòng mới không?

+0

Đây là một ví dụ tốt về những gì xảy ra với (bản sửa lỗi và những gì PowerShell) * vỏ nix phổ biến . –

+0

Từ ngữ câu hỏi tiềm năng khác: làm cách nào để lọc 'tìm' bằng cách sử dụng cú pháp bao gồm và loại trừ' rsync'? –

Trả lời

2

Hy vọng câu hỏi sẽ được chuyển đến trang web thích hợp, tuy nhiên tôi sẽ trả lời ở đây.

Bạn có thể thêm một ống với awk:

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

này giúp loại bỏ tất cả các thông tin không mong muốn bằng cách xuất ra tất cả mọi thứ từ các lĩnh vực 5, nhưng chỉ hoạt động nếu không ai trong số bốn lĩnh vực đầu tiên trong định dạng đầu ra được thêm khoảng trắng ở đâu đó (không chắc chắn).

Giải pháp awk này sẽ không hoạt động nếu có tên tệp bắt đầu bằng khoảng trắng.

Một cách thậm chí còn mạnh mẽ hơn để giải quyết có thể là một chương trình khá phức tạp cũng như đưa ra các giả định.

Nó hoạt động theo cách này: Đối với mỗi dòng,

  • Cắt 10 byte đầu tiên. Xác minh rằng chúng được theo sau bởi một số không gian. Cắt chúng ra là tốt.
  • Cắt bỏ tất cả các chữ số sau. Xác minh rằng chúng được theo sau bởi một không gian. Cắt nó đi.
  • Cắt bỏ 19 byte tiếp theo. Xác minh rằng chúng chứa ngày tháng và dấu thời gian ở định dạng thích hợp. (Tôi không biết tại sao các thành phần của ngày được tách riêng với / thay vì - - nó không tuân thủ ISO 8601.)
  • Xác minh rằng bây giờ một không gian sau. Cắt nó đi. Để lại bất kỳ ký tự khoảng trống nào còn nguyên vẹn, vì chúng thuộc về tên tệp.
  • Nếu thử nghiệm đã vượt qua tất cả các xác minh này, có khả năng phần còn lại của dòng đó sẽ chứa tên tệp.

Nó được thậm chí tồi tệ hơn: đối với trường hợp góc rất bí truyền, có rất nhiều điều khác để xem: tên tập tin có thể được thoát. Một số byte không thể in được thay thế bằng một chuỗi thoát (#ooo với ooo là mã bát phân), một quá trình phải được đảo ngược.

Do đó, không phải awk cũng không phải đơn giản sed tập lệnh sẽ thực hiện tại đây nếu chúng tôi muốn thực hiện đúng cách.

Thay vào đó, kịch bản Python sau đây có thể được sử dụng:

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') 

này kết quả đầu ra danh sách các tên tập tin phân cách bằng ký tự NUL, tương tự như cách find -print0 và nhiều công cụ khác làm việc để mà ngay cả một tên tập tin chứa một ký tự dòng mới (có giá trị!) được giữ lại chính xác:

rsync . | python rsf.py | xan -0 stat -c '%i' 

hiển thị chính xác số inode của mỗi tệp nhất định. Chắc chắn tôi có thể đã bỏ lỡ một hoặc góc trường hợp khác mà tôi không nghĩ đến, nhưng tôi nghĩ rằng kịch bản xử lý chính xác nhiều trường hợp nhất (tôi đã thử nghiệm với tất cả 255 tên tập tin một byte có thể nghĩ được cũng như một tên tệp bắt đầu bằng dấu cách).

+2

cũng awk có lẽ là phù hợp hơn cho việc này, như awk hiểu một nhà điều hành lĩnh vực cuối cùng 'rsync ... | awk '{print $ NF}' ' –

+0

Các giải pháp tối thiểu và dễ vỡ như thế này sẽ không bao giờ được sử dụng. –

+0

@rbtux Chúc may mắn với một tên tệp như 'Bài hát yêu thích của tôi.mp3'. – glglgl

0

rsync ... | sed -E 's|^([^\s]+\s+){4}||'

7

Sau nhiều năm làm việc, đây là giải pháp của tôi cho vấn đề này lâu đời:

DIR=`mktemp -d /tmp/rsync.XXXXXX` 
rsync -nr --out-format='%n' serveripaddress::pt/dir/files/ $DIR > output.txt 
rmdir $DIR 
+2

Ngoài ra, điều này có thể hoạt động, nhưng tôi không chắc chắn nếu điều này được ghi lại: 'rsync -nr --out-format = '% n' serveripaddress :: pt/dir/files// dev/false> output.txt' và không, '/ dev/null' sẽ không hoạt động –

Các vấn đề liên quan