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).
Đâ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 . –
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'? –