Как _MOVE_ файлы с помощью scp?

46

Как не копировать, а перемещать файлы с одного сервера на другой (оба Linux)?

man scpне дал мне ничего полезного. Я не могу использовать 'scp' тогда 'rm', потому что я должен убедиться, что файл успешно передан. Если во время передачи возникает какая-либо ошибка, файл не должен быть удален.

Возможно, мне следует как-нибудь использовать код выхода, но как? Кроме того, существует много файлов, и если последний файл не удастся, будет не очень хорошим вариантом сохранить всю кучу успешно переданных файлов.

Может быть, есть что-то кроме SCP?

Putnik
источник

Ответы:

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 поддерживает рекурсивный режим для большинства целей.
Том Х
После этого используйте это для очистки любых пустых папок (rsync не удалит их): serverfault.com/a/95935/58568
bmaupin
1
Просто добавили smv() { rsync -az --remove-source-files "$@"; }в мой набор инструментов. Спасибо.
Рис Улерих,
Что делать, если у вас нет 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, но я очень надеюсь, что вы используете.

MadHatter поддерживает Монику
источник
1
Я чувствую, что это должен был быть ответ. Он отвечает на поставленный вопрос точно.
Трэвис Григгс
Так как SCP не обрабатывает (AFAIK) полосу пропускания с ограничением, я использовал вашу строку с 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"для удаления с диска. При перемещении файлов, особенно между компьютерами, все может пойти не так, поэтому может быть полезно выполнить копирование и удаление отдельно и удалять файл только тогда, когда вы точно знаете, что он был успешно скопирован первым.

Яннис
источник