Как не копировать, а перемещать файлы с одного сервера на другой (оба 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: