5

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

У меня есть несколько удаленных файлов на разных уровнях подкаталогов:

remote:/directory/subdir1/file1.ext
remote:/directory/subdir1/subsubdir11/file11.ext
remote:/directory/subdir2/subsubdir21/file21.ext

И у меня есть файл, который перечисляет все из них:

remote:/directory/allfiles.txt

Чтобы скопировать их наиболее эффективно, на удаленном сайте я мог просто сделать

tar zcvf allfiles.tgz `cat /directory/allfiles.txt`

но не хватает места для этого.

У меня достаточно места на моем локальном диске. Есть ли способ , чтобы tar входящий поток из удаленного сервера ( с помощью scp или ssh для передачи)?

Что-то вроде /localdir$ tar zc - | ssh remote cat /directory /allfiles.txt` Я бы догадался - но это только список удаленных файлов на локальном хосте.

3 ответа3

5

Вы поняли это почти правильно, просто запустите tar на удаленном хосте, а не локально. Команда должна выглядеть примерно так:

ssh remote_host tar cvfz - -T /directory/allfiles.txt > remote_files.tar.gz
1

Если у вас достаточно места на локальном диске, и ваша цель - минимизировать количество данных, отправляемых по сети, возможно, этого достаточно, чтобы включить сжатие с помощью scp или rsync :

scp -avrC remotehost:/path/to/files/file1 /files/file2 ...  local/destination/path

Конечно, вы можете сделать небольшой скрипт, чтобы зациклить каждый файл и выполнить сжатую передачу scp, даже без использования tar. С rsync все уютнее

rsync -avz --files-from=FILE remotehost:/path/to/files  local/destination/path

Вы можете подключиться через ssh к удаленному хосту и написать туда

tar cvzf - -T list_of_filenames | ssh Local_Hostname tar xzf -

Рекомендации:

  • от man scp:

    -C      Compression enable.  Passes the -C flag to ssh(1) to enable compression.
    
  • от man rsync

    --files-from=FILE       read list of source-file names from FILE
    -z, --compress          compress file data during the transfer
    --compress-level=NUM    explicitly set compression level
    
0

Если мы примем вашу стартовую команду:

tar zcvf allfiles.tgz `cat /directory/allfiles.txt`

тогда все, что нам нужно сделать, это убедиться, что файл заканчивается удаленно. Так что давайте разархивируем tar, что, хотя netcat sand и сохраняет его в виде локального файла.

В качестве альтернативы, что-то вроде этого:

местный: nc -l 1234 | gunzip | tar zcvf allfiles.tgz
удаленный: cat /directory/allfiles.txt | gzip | nc localIP 1234

Объяснение:

Локальный, шаг 1: ввод от netcat. -Л слушать на каком-то порту. Отправьте вывод туда, куда вы хотите.
Удаленный: шаг 1: вы уже выходите из списка файлов. Gzip для минимальной сети данных. Отправить результаты на локальный.
local: Шаг 2: Хм, мы уже получаем файлы в формате gzip. Давайте распакуем их перед подачей на смолу.

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