Назад | Перейти на главную страницу

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

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

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

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

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

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 является значением по умолчанию, поэтому его можно не указывать.

Использовать rsync вместо того scp:

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

Больше информации с man rsync.

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

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

Я понимаю вашу точку зрения о нескольких файлах для правильного копирования и обработки сбоев в стеке, поэтому для нескольких файлов:

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

Последнее практично, только если вы используете ssh-agent, но я очень надеюсь на вас.

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

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

работает для меня.

если у вас более старый целевой сервер, как у меня, вы не можете использовать

--remove-source-files

но ты должен использовать

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

вместо.

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

Думал, что предлагаю альтернативу найденному мной rsync, lftp, потому что для rsync требуется доступ к оболочке, который блокирует мой сервер sftp.

lftp -e "mirror --Remove-source-files ./remote/path/ /local/path/; quit" remoteuser@remotehost:

Вы также можете передать пароль, если вам нужно запустить это как часть пакетного процесса / задания cron (очевидно, небезопасно)

lftp --password hunter2 -e "mirror --Remove-source-files ./remote/path/ /local/path/; quit" remoteuser@remotehost: