Làm cách nào để tải xuống tệp mới nhất trong một thư mục bằng scp?


10

Tôi muốn chạy chuyển scp để tải xuống tệp mới nhất (mới nhất) trong một thư mục nhất định vào thư mục cục bộ của tôi.

Một cái gì đó như thế này:

  • nguồn :root@rimmer.sk:/home/rimmer/backups/
  • điểm đến :/home/rimmer/backups/

Trong khi chỉ nhận được tệp mới nhất, không phải tất cả chúng, trong backups.

Câu trả lời:


12

Giả sử bạn có các biến serverdirđược xác định, bạn có thể làm

$ dir="~"
$ server="user@server.com"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

Nơi đầu tiên bạn tìm tệp mới nhất, sau đó sao chép nó.

Lưu ý: Tôi đã không kiểm tra tính dễ kiểm tra (ví dụ: mục mới nhất là một thư mục)


Nếu đó là một thư mục sẽ không scp bất cứ điều gì. Bạn cần sử dụng scp -r.
slm

@slm Đúng, nhưng anh ta có thể không muốn sao chép điều đó.
Bernhard

Nếu scpget bị gián đoạn, nó sẽ phải khởi động lại việc sao chép từ đầu, rsynccó thể tiếp tục từ nơi nó bị tắt.
slm

Đối với bash, tôi cần thay thế các dấu ngoặc đơn bằng dấu ngoặc kép trong đối số thành ssh.
Julian Bittner

1
Bạn có thể xóa $ dir đầu tiên bằng cách thực hiện như sau (thêm a /*vào cuối của $ dir thứ hai):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse

1

scpthật ngu ngốc khi nó chỉ sao chép một cách mù quáng các tập tin từ nguồn tới đích. Nếu bạn muốn một cái gì đó thông minh hơn về sao chép tệp, bạn sẽ cần sử dụng một công cụ như rsync.

$ rsync -avz root@rimmer.sk:'$(find /home/rimmer/backups/ -ctime -1)' /home/rimmer/backups/

Điều này sẽ chỉ sao chép các tệp bị thiếu hoặc đã thay đổi từ thư mục sao lưu của rimmer.sk vào ngày cuối cùng (-ctime -1) vào thư mục sao lưu cục bộ của bạn.

-ctime n
   File's  status  was last changed n*24 hours ago.  See the comments for 
   -atime to understand how rounding affects the interpretation of file 
   status change times.

Người giới thiệu


Vấn đề với rsync là như nhau. Nếu tôi đã ngoại tuyến trong 2 ngày, nó sẽ cố gắng sao chép tất cả các bản sao lưu từ tất cả các ngày mà tôi không cần và rất lớn.
Richard Rodriguez

@RichardRodriguez - OK vui lòng cập nhật câu hỏi của bạn và cụ thể hơn những gì bạn đang theo dõi.
slm

2
@slm: Tôi nghĩ rằng câu hỏi là đúng như vậy. Tôi chỉ muốn tải về tập tin mới nhất trong một thư mục. Tôi có thể giải thích gì thêm về nó? :)
Richard Rodriguez

@RichardRodriguez - tập tin nào trong thư mục này? Một danh sách mẫu sẽ hữu ích.
slm

1
Tại sao bỏ phiếu xuống?
slm

0

Một chút muộn cho bữa tiệc nhưng có lẽ một giải pháp với ssh và rsync sẽ làm việc cho một số:

source_host="yourhost.com"
source_dir="/a/dir/on/yourhost.com/"
target_dir="/the/dir/where/last_backup/will/be/placed"
last_backup=$(ssh user@${source_host} "ls -t ${source_dir} | head -1")
if [ "${last_backup}" == "" ]; then
    echo "ERROR: didn't find a backup, cannot continue!"
else
    echo "the last backup is: ${last_backup}"
    rsync -avzh user@${source_host}:${source_dir}/${last_backup} ${target_dir}
fi
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.