Здесь нужно обсудить несколько вещей.
Во-первых, ошибка командной строки, затем подробности этой строки.
Гипотезы относительно источника ошибки
Таким образом, аргумент omryg@localhost:/cs/sci/omryg/dummy/bla.txt
не выглядит неверным.
Возможно ли, что в вашем файле есть недопустимые непечатаемые символы transfer.log
? Я думаю более конкретно о неправильных маркерах для новой строки. Иногда это происходит при редактировании файлов в Windows (например, vim
будет показывать символ ^M
в конце каждой строки; это называется кодировкой "dos"). Однако тот факт, что обе строки обрабатываются последовательно, намекает на правильно обнаруженные символы новой строки…
Вместо однострочного вы можете декомпозировать свой код как таковой
sshpass -p "mypass" cat transfer.log > local.log
и проверить local.log
? vim
показывает непечатаемые символы, но более тщательный поиск может включать hexdump
.
hexdump -c local.log
будет отображать символы, по 16 на строку. Символ новой строки представлен \n
. Обратите внимание, что при использовании ванили, hexdump
"сбрасывает шестнадцатеричный код", т.е. выводит шестнадцатеричные коды для символов. Опция -c
показывает представления указанных символов.
Если все в порядке, вы можете попробовать еще:
cat local.log | parallel …
Я не могу прокомментировать ниже вашего вопроса, потому что мой аккаунт свободен sh новый. Я буду ждать ваших ответов и при необходимости адаптирую свой ответ.
Комментарии к некоторым деталям команды
- Проблемы безопасности
В ваших командных строках , вы явно вводите свой пароль; попробуйте создать обмен ключами с сервером: сгенерируйте пару ключей на локальном компьютере с помощью ssh-keygen
, скопируйте содержимое ключа publi c (по умолчанию ~/.ssh/id_rsa.pub
) в удаленный файл ~/.ssh/known_hosts
(создайте его, если он отсутствует, оператор перенаправления bash >>
делает это, то есть добавляет файл и создает его, если он отсутствует). Подробнее об этом здесь . Как общий комментарий, ваш пароль должен храниться только в вашем мозгу, но не в скрипте и не в истории команд вашей оболочки. Я не рекомендую использовать sshpass
вообще.
Использование
parallel
и
rsync
Теперь об использовании parallel
. Это часто считается альтернативой явным циклам (while и for) путем параллельного выполнения итераций. В вашем случае вы запускаете rsync
, команду сетевой передачи, параллельно. Во-первых, rsync
оптимизирован для последовательных передач и анализа целых каталогов. Во-вторых, независимо от того, сколько процессоров вы используете, вы, скорее всего, будете ограничены общей пропускной способностью сети. Использование parallel
также может иметь недостаток: все выходы ваших распараллеленных команд смешиваются и упорядочиваются по мере их запуска . Может быть трудно диагностировать ошибки с большим количеством элементов для обработки. Если вы действительно хотите ограничить список файлов, передаваемых с помощью rsync
, вы можете обратиться к опции --include-from=list.txt
, где list.txt
- это файл шаблонов ASCII (поэтому работают простые имена файлов), по одному на строку. Если вы уверены, что не хотите использовать шаблоны, существует более простой вариант --files-from=list.txt
. В этом случае вам нужно только передать каталог в качестве аргумента источника; rsyn c возьмет файлы из него. Подробнее об этом параметре на странице руководства, и соответствующая выдержка была процитирована в extenso там . Наконец, если вам нужно обработать 2 аргумента для запуска на 2 процессорах, вы можете пропустить часть -j 2
; это автоматически устанавливается в вашем случае.
Настройка хоста S SH
Я заметил, что вы используете localhost
и номер порта -p 12345
, который, кажется, указывает на локальный туннель. В случае, если вам нужно вводить это часто, вы можете завершить локальную конфигурацию S SH (~/.ssh/config
) с помощью "ярлыка":
host my-proxy
HostName localhost
Port 12345
User omryg
, и теперь ваша командная строка просто читает rsync -ave 'ssh' my-proxy:/cs/sci/omryg/dummy ./
. Обратите внимание на отсутствие -p 12345
и omryg@localhost
.