Як _MOVE_ файли з scp?


46

Як не копіювати, а переміщувати файли з одного сервера на інший (обидва Linux)?

man scpне давали мені нічого корисного. Я не можу використовувати 'scp', а потім 'rm', тому що я повинен переконатися, що файл успішно передано. Якщо під час передачі є якась помилка, файл не слід видаляти.

Можливо, я повинен якось використовувати вихідний код, але як? Також файлів дуже багато, і якщо останній файл виходить з ладу, це був би не дуже хороший варіант зберегти цілу купу успішно переданих файлів.

Можливо, є щось, крім SCP?

Відповіді:


47

rsync over ssh - це, мабуть, найкраща ставка з --remove-source-filesопцією

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

швидкий тест дає;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

Як зазначалося @SvenW, -e sshтиповим є показник, тому його можна опустити.


7
-e sshє неявним за замовчуванням вже багато років, зазвичай більше не потрібно використовувати цей параметр.
Свен

@SvenW ах добре знати! У мене немає великої потреби в rsync щодня, оскільки scp підтримує рекурсивний режим для більшості цілей.
Том H

Після цього використовуйте це для очищення порожніх папок (rsync їх не видалить): serverfault.com/a/95935/58568
bmaupin

1
Щойно доданий smv() { rsync -az --remove-source-files "$@"; }до моєї панелі інструментів. Дякую.
Rhys Ulerich

Що робити, якщо у вас немає rsync? Наприклад, у OpenWrt немає rsync, і мені потрібно використовувати scp для переміщення файлів. Що ж тепер робити?
валент

19

Використовуйте rsyncзамість scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

Більше інформації з man rsync.


17

На це запитання відповіли чудово, і відповідь прийняли, але, оскільки він занесений у верхню частину титульної сторінки, я подумав, що хоча б спробую відповісти на нього точніше, якщо менш елегантно. Так, ви можете використовувати зворотний код від scp, і я роблю це часто. В bash:

scp foo user@server:/destination && rm foo

Я вважаю, що щодо декількох файлів правильно скопіювати та обробити помилку стека, тому для декількох файлів:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

Останнє є практичним, лише якщо ви користуєтесь ssh-agent, але я дуже сподіваюся, що ви є.


1
Я відчуваю, що це повинна була відповісти. Це відповідає точно на поставлене запитання.
Тревіс Гріггс

Оскільки SCP не справляється з обмеженням пропускної здатності (AFAIK), я використовував ваш hanswer з rsync для переміщення файлів один за одним у визначений пропускну здатність. Дякую !
Moonchild

@Moonchild, scp насправді може обробляти обмеження пропускної здатності, використовуючи -lпрапор. Наприклад, -l 8192обмежити передачу на 8192 кб / с
Спенсер D

3

в моїй ситуації порт ssh не 22, так

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

працює для мене.


5
Вам набагато краще вводити власні номери порту ssh у ваш файл налаштування ssh (~ / .ssh / config), ніж вказувати їх для кожної команди. Його можна вказати глобально, на хоста або для регулярного виразу, що відповідає імені хоста.
підкрадатися

Як встановити порти індивідуально як для джерела, так і для призначення?
Brethlosze

3

якщо у вас є старший цільовий сервер, як у мене, ви не можете використовувати його

--remove-source-files

але вам доведеться користуватися

--remove-sent-files --protocol=29

замість цього.


3

Якщо це зробити в два етапи не є проблемою, ви можете scpскопіювати файл з віддаленого сервера, а потім виконати його ssh -e "rm /path/to/file"для видалення з диска. Під час переміщення файлів, особливо між машинами, може піти не так, тому копію та видалення може бути корисно виконати окремо, а видалити файл лише тоді, коли ви точно знаєте, що він був успішно скопійований.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.