2013-06-02 39 views
171

Tôi muốn sao chép tệp từ/sang máy chủ từ xa trong các thư mục khác nhau. Ví dụ, tôi muốn chạy 4 lệnh này cùng một lúc.scp hoặc sftp sao chép nhiều tệp bằng một lệnh duy nhất

scp remote:A/1.txt local:A/1.txt 
scp remote:A/2.txt local:A/2.txt 
scp remote:B/1.txt local:B/1.txt 
scp remote:C/1.txt local:C/1.txt 

Cách dễ nhất để làm điều đó là gì?

+1

Một kịch bản? ...... –

+8

Khi tôi thực hiện một kịch bản, tôi đã phải đặt mật khẩu cho mỗi lệnh. Tôi có thể tránh nó không? – user987654

+6

Tránh lặp lại mật khẩu theo cách này: scp từ xa: "A/1.txt A/2.txt B/1.txt C/1.txt" địa phương: ./ – JohnMudd

Trả lời

1
scp remote:"[A-C]/[12].txt" local: 
+0

cảm ơn, nhưng nó chỉ là một ví dụ và tên tệp hoặc thư mục thực sự phức tạp hơn. Nhưng tôi có một danh sách. – user987654

+0

Bạn có thể mô tả chúng bằng cụm từ thông dụng không? – unxnut

+0

Có thể bảo toàn cấu trúc thư mục giống nhau trong thư mục đích bằng cách sử dụng cụm từ thông dụng không? – user987654

41

Bạn có thể sao chép toàn bộ thư mục bằng cách sử dụng công tắc -r vì vậy nếu bạn có thể cô lập các file vào thư mục riêng, bạn có thể sao chép tất cả mọi thứ cùng một lúc.

scp -r ./dir-with-files [email protected]:upload-path 

scp -r [email protected]:path-to-dir-with-files download-path 

nên ví dụ

scp -r [email protected]:/var/log ~/backup-logs 

Hoặc nếu có chỉ là vài trong số họ, bạn có thể sử dụng:

scp 1.txt 2.txt 3.log [email protected]:upload-path 
54

Từ địa phương để máy chủ:

scp file1.txt file2.sh [email protected]:~/pathtoupload

Từ máy chủ để địa phương:

scp [email protected]:"file1.log file2.log" "~/yourpathtocopy"

242

Sao chép nhiều tập tin từ xa đến địa phương:

$ scp [email protected]:/some/remote/directory/\{a,b,c\} ./ 

Sao chép nhiều tập tin từ địa phương để từ xa:

$ scp foo.txt bar.txt [email protected]:~ 
$ scp {foo,bar}.txt [email protected]:~ 
$ scp *.txt [email protected]:~ 

Sao chép nhiều tập tin từ xa từ xa:

$ scp [email protected]:/some/remote/directory/foobar.txt \ 
[email protected]:/some/remote/directory/ 

Nguồn: http://www.hypexr.org/linux_scp_help.php

+4

Lệnh đầu tiên bỏ qua một kết thúc ".", Và '{a, b, c}' bằng \ {a, b, c \}. – duleshi

+9

Tôi nghĩ rằng OP đang cố gắng sao chép nhiều tệp trong nhiều thư mục cục bộ sang nhiều thư mục từ xa, những ví dụ này sẽ không thực hiện công việc vì tất cả chúng sẽ chỉ quét các tệp thành '~' hoặc '. /'. – aesede

+9

Hãy coi chừng: không có dấu cách sau dấu phẩy trong dấu ngoặc nhọn. Tôi chỉ mất 10 phút cố gắng tìm ra lý do tại sao lệnh của tôi không hoạt động và đó là vì không gian. – deepak

24

Như đã đề cập, bạn có thể sử dụng scp -r [email protected]:/some/remote/path /some/local/path để sao chép tệp đệ quy. Điều này giả định rằng có một thư mục chứa tất cả các tệp bạn muốn chuyển (và không có gì khác).

Tuy nhiên, SFTP cung cấp một sự thay thế nếu bạn muốn chuyển các tập tin từ nhiều thư mục khác nhau, và các điểm đến không giống hệt nhau:

sftp [email protected] << EOF 
    get /some/remote/path1/file1 /some/local/path1/file1 
    get /some/remote/path2/file2 /some/local/path2/file2 
    get /some/remote/path3/file3 /some/local/path3/file3 
EOF 

này sử dụng cú pháp "here doc" để xác định một chuỗi các lệnh đầu vào SFTP. Thay vào đó, bạn có thể đặt lệnh SFTP vào tệp văn bản và thực thi sftp [email protected] -b batchFile.txt

+0

Câu trả lời duy nhất này thực sự trả lời câu hỏi. Cảm ơn. Tôi đã được Googling và phân tích các hướng dẫn sử dụng 'scp' cho quá lâu cố gắng để tìm tính năng này, và tôi đoán scp không có nó. – sudo

3

LƯU Ý: Tôi xin lỗi trước vì chỉ trả lời một phần câu hỏi trên. Tuy nhiên, tôi thấy các lệnh này hữu ích cho nhu cầu unix hiện tại của tôi.

Đăng tải các file cụ thể từ một máy cục bộ đến một máy từ xa:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/

Tải lên toàn bộ thư mục từ một máy cục bộ đến một máy từ xa:

~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/

tải toàn bộ một thư mục từ máy từ xa đến máy cục bộ:

~/Desktop$ scp -r [email protected]:Public/web/ Desktop/

10

Sao chép nhiều thư mục:

scp -r dir1 dir2 dir3 [email protected]:~/ 
+0

Đây là câu trả lời của câu hỏi Jiri Kremer –

+0

là cách sao chép từ thư mục từ xa sang địa phương, không phải cách khác. – Tagar

12

Cách đơn giản nhất là

local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./ 

Vì vậy {..} danh sách có thể bao gồm các thư mục (A, B và C ở đây là thư mục; "1.txt" và "2.txt" là tên tệp trong các thư mục đó).

Mặc dù nó sẽ sao chép tất cả bốn tệp này vào một thư mục cục bộ - không chắc chắn nếu đó là những gì bạn muốn.

Trong trường hợp trên, bạn sẽ kết thúc các tệp từ xa A/1.txt, A/2.txt, B/3.txt và C/4.txt được sao chép sang một thư mục cục bộ duy nhất, với tên tệp ./ 1.txt, ./2.txt, ./3.txt và ./4.txt

+0

Điều này sẽ không ghi đè lên nội dung của A/1.txt với nội dung của B/1.txt trên máy cục bộ không? –

+0

ví dụ về điều chỉnh tốt .. (do đó, bây giờ nó sẽ không ghi đè) và thêm mô tả. Cảm ơn. – Tagar

+0

Mở rộng cú đúp như thế này là một tính năng của Bash và không thể di chuyển được, ví dụ: POSIX 'sh'. – tripleee

2

lệnh của bạn hoạt động hoàn hảo nhưng, tôi cũng muốn thay đổi tên tệp trong khi gửi cục bộ sang điều khiển từ xa. Tôi đã viết một lệnh: - sshpass mật khẩu -p scp /path/to/file.txt root @ tên máy chủ: /path/newfile.txt

Nhưng nó cho lỗi rằng /path/newfile.txt: Không có tệp nào hoặc thư mục được tìm thấy plz giúp tôi trong tình huống này

0

Trong trường hợp của tôi, tôi bị giới hạn chỉ sử dụng lệnh sftp.
Vì vậy, tôi đã phải sử dụng một batchfile với sftp. Tôi tạo ra một kịch bản như sau. Điều này giả định bạn đang làm việc trong thư mục/tmp, và bạn muốn đặt các tệp trong destdir_on_remote_system trên hệ thống từ xa. Điều này cũng chỉ hoạt động với thông tin đăng nhập không tương tác. Bạn cần thiết lập khóa công khai/riêng tư để bạn có thể đăng nhập mà không cần nhập mật khẩu. Thay đổi khi cần.

#!/bin/bash 

cd /tmp 
# start script with list of files to transfer 
ls -1 fileset1* > batchfile1 
ls -1 fileset2* >> batchfile1 

sed -i -e 's/^/put /' batchfile1 
echo "cd destdir_on_remote_system" > batchfile 
cat batchfile1 >> batchfile 
rm batchfile1 

sftp -b batchfile [email protected] 
3

Vấn đề: Sao chép nhiều thư mục từ máy chủ từ xa để máy cục bộ bằng cách sử dụng lệnh SCP đơn và giữ lại mỗi thư mục cũng như trên các máy chủ từ xa.

Giải pháp: SCP có thể thực hiện việc này dễ dàng. Điều này giải quyết vấn đề khó chịu khi nhập mật khẩu nhiều lần khi sử dụng SCP với nhiều thư mục.

ví dụ:

# copies folders t1, t2, t3 from `test` to your local working directory 
# note that there shouldn't be any space in between the folder names; 
# we also escape the braces. 
# please note the dot at the end of the SCP command 

~$ cd ~/working/directory 
~$ scp -r [email protected]:/work/datasets/images/test/\{t1,t2,t3\} . 

PS: Thúc đẩy bởi câu trả lời tuyệt vời này: scp or sftp copy multiple files with single command

+1

Cũng hoạt động trong Git Bash cho Windows. – James

1

Trong trường hợp cụ thể mà tất cả các file có phần mở rộng tương tự nhưng với hậu tố khác nhau (chẳng hạn số lượng tập tin log) bạn sử dụng như sau:

scp [email protected]: /some/log/folder/some_log_file.* ./

này sẽ sao chép tất cả các tập tin có tên some_log_file từ thư mục đưa ra trong vòng điều khiển từ xa, tức là-some_log_file.1, some_log_file.2, some_log_file.3 ....

Chúc mừng,

Guy

4

Những câu trả lời với {file1,file2,file3} công trình chỉ với bash (trên xa hoặc địa phương)

Cách thực là:

scp [email protected]:'/path1/file1 /path2/file2 /path3/file3' /localPath 
1

scp sử dụng ssh cho dữ liệu chuyển với cùng một xác thực và cung cấp bảo mật giống như ssh.

Cách thực hành tốt nhất ở đây là triển khai "Khoá SSH và BẢN QUYỀN KHÓA CHÍNH CÔNG". Với điều này, bạn có thể viết kịch bản của bạn mà không cần lo lắng về xác thực. Đơn giản như thế.

Xem WHAT IS SSH-KEYGEN

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