19

Я должен перенести много файлов с одного компьютера на другой (оба Linux). Я хотел бы использовать для этого scp , но scp позволяет передавать только один файл за раз.

Как я могу это сделать?

я имею

  • Нет возможности использовать rsync или любой другой протокол
  • Нет возможности использовать сертификаты без парольной фразы (но есть сертификат с парольной фразой)
  • Список файлов для передачи и список с путем назначения файлов на другом сервере
  • Файлы распределены по многим каталогам, и не все файлы в каталогах, которые я хочу скопировать

Если возможно, я бы хотел прозрачно распаковать и распаковать, чтобы сэкономить пропускную способность!

Это возможно?

6 ответов6

29

Используйте tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
13

Я хотел бы использовать для этого scp, но scp позволяет передавать только один файл за раз.

Я почти уверен, что это не так, по крайней мере, для команды scp предоставляемой OpenSSH, включенной в большинство дистрибутивов Linux.

Я использую scp file1 file2 ... fileN user@host:/destination/directory/ довольно часто.

Для прозрачного сжатия это встроено в протокол SSH, и scp может использовать его, если вы укажете опцию -C в командной строке. Для множества похожих небольших файлов вы найдете вариант tar+gz, предложенный akira, улучшающий сжатие, поскольку он может использовать сходство между такими файлами, где scp сжимает каждый файл как отдельный объект. Обычно я предпочитаю использовать scp, так как проще возобновить частичную передачу (или, хотя я знаю, что в этой ситуации у спрашивающего нет возможности) rsync как это еще проще возобновить, и совместно использует опцию tar+gz преимущество сжатия всего потока.

4

Не работает scp -r yourdir otherhost:/otherdir ?

Попробуйте это тогда:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

z -flag to tar выполняет сжатие. Или вы можете использовать -C для SSH:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
1

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

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
0

Это может быть сделано без особых проблем.

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

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

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

-1

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

tar -cvf allfiles.tar -L mylist.txt

Затем используйте scp для загрузки архива.

scp user @ remotehost:~/allfiles.tar

https://stackoverflow.com/questions/8033857/tar-archiving-that-takes-input-from-a-list-of-files

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .