a | b
подключения STDOUT
от a
и STDIN
от b
только при помощи dup/dup2
. Обе команды выполняются параллельно.
a =(b)
заменяет аргумент a
с временным именем файла. b
будет выполняться прежде a
поскольку временный файл должен быть создан, прежде чем он сможет быть передан a
a <(b)
заменяет аргумент a
с именованным каналом. a
и b
выполненный параллельно. Это теперь, где это становится немного сложным:
• b
в фоновом режиме и не может читать из терминала. Можно протестировать его сами при помощи strace -p $PID
для присоединения к второй кошке обрабатывают для наблюдения процесса.
• a
тем временем попытки читать из именованного канала, но ничего не могут считать как как b
не можете прочитать.
• Это означает, что у Вас в основном есть мертвая блокировка где a
попытки читать из b
но b
не может читать из STDIN
и не может записать в a
Больше информации о фоновом процессе и терминале от удара человека:
Для упрощения реализации пользовательского интерфейса к управлению заданиями операционная система поддерживает понятие текущего терминального идентификатора группы процесса. Члены этой группы процесса (обрабатывает, чей идентификатор группы процесса равен текущему терминальному идентификатору группы процесса) получают сгенерированные клавиатурой сигналы, такие как SIGINT. Эти процессы, как говорят, находятся на переднем плане. Фоновые процессы - те, идентификатор группы процесса которых отличается от терминала; такие процессы неуязвимы для сгенерированных клавиатурой сигналов. Только приоритетным процессам позволяют читать из или, если пользователь так указывает с stty tostop, запишите в терминал. Фоновые процессы, которые пытаются читать из (пишут в то, когда stty tostop в действительности) терминал отправляется SIGTTIN (SIGTTOU) сигнал терминальным драйвером ядра, который, если не поймано, приостанавливает процесс.
Попробовать
rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/
Я снял запаздывающую наклонную черту /
от исходного пути к каталогу. Это сделает rsync
скопируйте каталог и все его содержание, что означает rsync
будет волноваться о завоевывании репутацию корректного на удаленном хосте (который это будет) вместо Вас.
Хорошо я собираюсь ответить на этот вопрос сам, хотя кто-то еще мог бы сделать лучшее задание объяснения его.
Очевидно установка на целевой машине влияет, как аргументы анализируются, и у нас должно быть что-то установка, которая мешает использовать кавычки или наклонные черты для выхода из пробелов, но мы можем использовать подстановочные знаки, таким образом, я сделал это
rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*
Это работает на меня, потому что существует только один каталог, который начинается с имени, если бы у меня было несколько каталогов, то это не работало бы.
В конечном счете я должен понять, как установить удаленный сервер так, чтобы он мог проанализировать путь более эффективно - я никогда не использую пробелы в именах каталогов, но человеке, который настроил, это сделало и по крайней мере на данный момент я застреваю
Попробуйте так:
find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Попробуйте
rsync --protect-args --size-only -avzPe ssh "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"
Из man rsync
:
-s, --protect-args
Эта опция отправляет все имена файлов и большинство параметров удаленного rsync, не позволяя удаленной оболочке интерпретировать их. Это означает, что пробелы в именах не разделяются, и любые специальные символы без подстановочных знаков не переводятся (например, ~, $,;, & и т. Д.). Подстановочные знаки расширяются на удаленном хосте с помощью rsync (вместо оболочки). [...]
Это работает в bash: экранируйте пробелы с помощью обратной косой черты и затем используйте кавычки:
rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .
Или, если у вас есть путь в переменной $ remote_path, можно использовать пробелы экранировать заменой:
rsync -avuz me@some.server.com:"${remote_path// /\\ }" .
В зависимости от ситуации можно быстро создать символическую ссылку в удаленной системе:
user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space
Затем используйте -L
флаг в rsync
, который указывает ему следовать содержимому каталога:
user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
Как правило, заключайте аргумент в кавычки и экранируйте символы пробела в аргументе. В приведенном вами примере попробуйте:
rsync --size-only -avzPe ssh "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"
Я понимаю, что это старый вопрос, но я подумал, что добавлю к существующему своду знаний.
Я использовал rsync
с несколькими папками с пробелами и это работает. У меня есть папки, пронумерованные от 1-10 следующим образом:
The\ Folder1
The\ Folder2
The\ Folder3
The\ Folder10
Два варианта использования rsync
- локальный и удаленный.
Local - Обратите внимание на отсутствие кавычек.
rsync -avu /media/data/The\ Folder* .
Удаленный - Обратите внимание на наличие кавычек
rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space
двойной escape тоже работает
Из справочных страниц rsync
:
If you need to transfer a filename that contains whitespace, you can
either specify the --protect-args (-s) option, or you'll need to escape
the whitespace in a way that the remote shell will understand. For
instance:
rsync -av host:'file\ name\ with\ spaces' /dest
В macOS мне приходилось экранировать первый путь в обычном режиме , а второй путь экранировался + кавычки . Пример:
rsync -avhu VirtualBox\ VMs/Windows\ 10 bob@192.168.1.42:"/Users/bob/VirtualBox\ VMs/"
Это единственная комбинация , которая работала с пробелами в macOS. Обе машины Mac.