Как скопировать только новые файлы с помощью команды «scp»?

24

Я копировал сотни файлов на другой компьютер, используя scpкоманду, что я получил stalled ошибку . Теперь я собираюсь скопировать файлы снова. Есть ли способ избежать копирования уже скопированных файлов?

Meysam
источник

Ответы:

40

Вы можете использовать rsyncдля этого. rsyncдействительно предназначен для этого типа операции.

Синтаксис:

rsync -avh /source/path/ host:/destination/path

или

rsync -a --ignore-existing /local/directory/ host:/remote/directory/

Когда вы запускаете его в первый раз, он копирует весь контент, а затем копирует только новые файлы.

Если вам нужно туннелировать трафик через соединение SSH (например, в целях конфиденциальности), как вы указали в первоначальном запросе решения на основе SCP, просто добавьте -e sshк параметрам rsync. Например:

rsync -avh -e ssh /source/path/ host:/destination/path
CVn
источник
Является ли --ignore-existingдействительно необходимо?
Мейсам
Потому что в этом примере руководства: rsync -t *.c foo:src/-> "Это передаст все файлы, соответствующие шаблону * .c, из текущего каталога в каталог src на машине foo. Если какой-либо из файлов уже существует в удаленной системе, то rsync remote- Протокол обновления используется для обновления файла путем отправки только различий "
Meysam
1
Я обычно использую rsync -avuzh /source/path/ host:/destination/path. Это делает всю работу в одной команде, и при последующих вызовах, только передает файлы, которые нуждаются в этом.
Эдвард Фальк
6

Если вы хотите использовать scp по какой-либо причине, вы можете удалить разрешения w для ваших локальных данных (если у вас есть право сделать это), и scp не будет их трогать. Чтобы быть более точным:

  1. chmod a-w local/*.tar.gz (в вашем местном каталоге)
  2. scp remote/*.tar.gz local

Это не очень эффективно, хорошо, но может помочь, если вам нужно быстрое временное решение, не переходя на что-то другое, кроме scp. (Слава: scp без замены существующих файлов в месте назначения )

xhudik
источник
Мне очень нравится это решение. Я собираю файлы с удаленных датчиков в архив. Целые рабочие каталоги - у каждого есть Архивный подкаталог. Как только файлы попадают в архив, они никогда не будут изменены. Было бы очень легко пометить заархивированные файлы как -w, так что это будет то, что я делаю. И рабочие файлы вне архивных каталогов можно оставить как есть, поэтому, если я запустлю программу обновления в течение дня, она все равно будет копировать файлы в процессе. Это именно то, что я искал. TNX много!
SDsolar
4

Точного ответа о том, как это сделать с SCP, не было, так как это был первоначальный вопрос.

sudo find /files/ -type f -exec chmod a-w {} \;

scp -r username@server.com:/file/location/* /files

После завершения копирования файлов измените разрешения обратно:

sudo chmod a+w -R /files

стог
источник
1
Ну, возможно, первоначальный вопрос был «как я могу решить эту проблему», для чего rsync является ответом.
Эдвард Фальк