Làm thế nào để scp với biểu thức thông thường


13

Tôi đang cố gắng sao chép tất cả các tệp không bắt đầu bằng chữ "a", bằng ksh.

Sao chép từ máy nguồn vào máy đích đang hoạt động tốt :

scp -p !(a*) user@machine:/path/directory/.

Nhưng, nếu tôi đang ở máy chủ đích và muốn sao chép từ máy chủ nguồn, thì không thành công:

scp -p user@machine:/path/!(a*) .

Có ý kiến ​​gì không?

Câu trả lời:


16

Tôi đồng ý với vonbrand. Globing được xử lý bởi trình bao bạn đang chạy. Vì vậy, scp user@machine:/path/*sẽ mở rộng / path / * thành các tệp trong LOCAL / path / *, không phải trên máy từ xa.

Tuy nhiên, chỉ vì nụ cười mà tôi đã thử:

scp "user@machine:/path/[regex here]" .  

va no đa hoạt động. Hãy thử điều đó. Lưu ý các trích dẫn. Rất cần thiết. Hãy cho chúng tôi biết.

Lưu ý: tài khoản người dùng trên máy từ xa có thể mặc định là chương trình shell khác với tài khoản của bạn , vì vậy các quy tắc mở rộng thẻ hoang dã có thể khác nhau, vì vậy hãy lưu ý rằng.


1

Đây không phải là "scp với các biểu thức thông thường", một trong những xử lý các tập tin là vỏ. scpchỉ cần được trao danh sách các tập tin đã được mở rộng. Và việc mở rộng xảy ra trên máy nơi lệnh được chạy.

Xin lỗi, không thể (dễ dàng) làm.


Câu trả lời này là sai. Vui lòng xóa :)
Michael

1

Những gì tôi tìm thấy là trên các máy HP-UX cũ hơn (parisc 11.11), tôi đã phải sử dụng [^ a] * Nhưng, trên các máy mới hơn (parisc 11.31 và mới hơn) nó hoạt động với! (A *)

Đây là những gì tôi đã kết thúc với. Và nó hoạt động:

    if [[  ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
    then
            scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
    else
            scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
    fi

Cả hai giải pháp đều hoạt động với tôi trên máy chủ 11.11.
DarkHeart

0

Các tên từ xa được chuyển đến scpthực sự được hiểu là một danh sách các mẫu được phân tách bằng khoảng trắng ở phía từ xa. Điều này thường gây phiền toái khi bạn cố sao chép một tệp có tên chứa khoảng trắng, nhưng ở đây nó hữu ích:scp -p 'user@machine:/path/a*' . sẽ sao chép tất cả các tệp có tên bắt đầu bằng a.

Lệnh của bạn sẽ hoạt động nếu bạn trích dẫn mẫu để nó được giải thích từ xa chứ không phải cục bộ, miễn là bạn vượt qua một rào cản khác. Mẫu !(a*)không phải là mẫu vỏ cơ bản, đó là phần mở rộng ksh (bash và zsh cũng hỗ trợ nếu bạn đặt tùy chọn phù hợp). Vì vậy, điều này sẽ chỉ hoạt động nếu vỏ từ xa của bạn là ksh, không phải nếu nó là một vỏ khác và bạnexec ksh từ .profilehoặc một cái gì đó tương tự.

Cách dễ dàng, trừ khi bạn ở trong một loại môi trường bị hạn chế hoặc cổ xưa, là quên đi scp. Bạn muốn các tệp từ xa hoạt động giống như các tệp cục bộ, vì vậy hãy đặt chúng thành các tệp cục bộ: gắn thư mục từ xa bằng sshfs . Điều này yêu cầu FUSE trên máy cục bộ và máy chủ SFTP (tức là một sftp-servertệp thực thi sshdkhởi chạy) trên máy từ xa.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.