Я не ознакомлен с emacs
или psql
. Но...
Похож на Вас, может использовать sshfs
смонтировать Ваш удаленный сервер и выполнить все локально:
sshfs user@host mount/directory/
cd mount/directory && emacs
При необходимости в командах выполнения в удаленной машине можно смонтироваться с sshfs
, затем доступ с ssh
затем используйте ssh символы ESC, чтобы приостановить ssh сессию и выполнить emacs в Вашей машине (редактирующий удаленные файлы, смонтированные с sshfs
).
Другим решением была бы установка emacs
в удаленной машине и копии Ваша конфигурация (я выбрал это решение, агрегированное в мерзавце repo для моего материала энергии),
Для передачи путей к файлу в качестве аргументов к команде, find
делает это самостоятельно с помощью опции -exec
без всякой xargs
хитрости:
find /home/user -name '*.csv' -exec yourcommand '{}' +
, которая найдет каждый файл с именем *. csv
в /home/user
и затем выполнить yourcommand /home/user/a\ b.csv /home/user/my\ dir/c\ d\$2.csv ...
со всеми найденными файлами в качестве аргументов. Каждый найденный файл передается программе в качестве отдельного полного аргумента, поэтому экранирование или что-либо еще не требуется: yourcommand
получает множество аргументов, каждый из которых является именно полным путем к файлу.
Другой подход заключается в том, что некоторые оболочки (zsh
), в частности, поддерживают более продвинутый глобус, где вы можете просто написать:
yourcommand **/*.csv
и получить точно такой же эффект.
Если вы действительно хотите, чтобы экранированные строки сами, а не запускали команду напрямую, вы можете использовать bash
встроенный printf
:
find /home/user -name '*.csv' -exec bash -c 'printf "%q " "$@"' dummy '{}' +
Спецификация формата %q
расширяется до версии строкового аргумента в виде оболочки. Со многими аргументами printf
повторяет строку формата для всех из них, таким образом создавая экранированные строки с пробелами для всех аргументов команды bash -c
. манекен
используется в качестве значения $0
, а "$@"
дает printf
все остальные аргументы, которые являются вашими (неповрежденными) именами файлов. Для вашего примера это выведет точно /home/user/a\ b.csv /home/user/my\ dir/c\ d\$2.csv
.
С помощью zsh
:
print -r -- **/*.csv(D:a:q)
Обратите внимание, что некоторые символы (такие как новая строка, табуляция или непечатаемые) выводятся с нотацией $'...'
, что может быть проблемой для вас.
Другой подход:
print -r -- *.csv(e/'REPLY=${(qq)REPLY:a}'/)
Где все пути к файлам заключены в одну кавычки.