Jak pobrać najnowszy plik z folderu za pomocą SCP?

10

Chciałbym uruchomić transfer scp, aby pobrać najnowszy (najnowszy) plik z określonego katalogu do mojego katalogu lokalnego.

Coś takiego:

  • źródło :[email protected]:/home/rimmer/backups/
  • miejsce docelowe :/home/rimmer/backups/

Pobierając tylko najnowszy plik, nie wszystkie, w backups.

Richard Rodriguez
źródło

Odpowiedzi:

12

Załóżmy, że masz zmienne serveri dirzdefiniowane, możesz to zrobić

$ dir="~"
$ server="[email protected]"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

Gdzie najpierw szukasz najnowszego pliku, a następnie skopiuj go.

Uwaga: nie sprawdziłem go pod kątem niezawodności (np. Najnowszy wpis jest folderem)

Bernhard
źródło
Jeśli jest to katalog, który niczego nie scpuje. Musisz użyć scp -r.
slm
@slm Poprawnie, ale może nie chcieć tego kopiować.
Bernhard
Jeśli scpget zostanie przerwany, będzie musiał ponownie rozpocząć kopiowanie od początku, rsyncmoże wznowić od miejsca, w którym zostało przerwane.
slm
W przypadku bash musiałem zastąpić pojedyncze cudzysłowy podwójnymi cudzysłowami w argumencie do ssh.
Johannes Bittner
1
Możesz usunąć pierwsze $ dir, wykonując następujące czynności (dodano a /*na końcu drugiego $ dir):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse
1

scpjest głupi w tym sensie, że po prostu ślepo kopiuje pliki ze źródła do miejsca docelowego. Jeśli chcesz czegoś bardziej inteligentnego w kopiowaniu plików, musisz użyć narzędzia takiego jak rsync.

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

Spowoduje to skopiowanie tylko brakujących plików lub takich, które zostały zmienione z katalogu kopii zapasowych rimmer.sk w ostatnim dniu (-ctime -1) do katalogu lokalnej kopii zapasowej.

-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.

Bibliografia

slm
źródło
Problem z rsync jest taki sam. Jeśli jestem offline przez 2 dni, próbuje skopiować wszystkie kopie zapasowe z wszystkich dni, których wcale nie potrzebuję i jest ogromny.
Richard Rodriguez
@RichardRodriguez - OK, zaktualizuj swoje pytanie i sprecyzuj, czego szukasz.
slm
2
@slm: Myślę, że pytanie jest w porządku. Chcę tylko pobrać najnowszy plik z katalogu. Co więcej mogę na ten temat wyjaśnić? :)
Richard Rodriguez
@RichardRodriguez - jakie pliki są w tym katalogu? Przydałaby się przykładowa lista.
slm
1
Dlaczego głosowanie w dół?
slm
0

Trochę późno na imprezę, ale być może rozwiązanie z ssh i rsync będzie działać dla niektórych:

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
DRAD
źródło