Как создать пространство разделенные, оставленные полные пути файлов, рекурсивно соответствующих шарику?

Я не ознакомлен с emacs или psql. Но...

Похож на Вас, может использовать sshfs смонтировать Ваш удаленный сервер и выполнить все локально:

sshfs user@host mount/directory/
cd mount/directory && emacs

При необходимости в командах выполнения в удаленной машине можно смонтироваться с sshfs, затем доступ с ssh затем используйте ssh символы ESC, чтобы приостановить ssh сессию и выполнить emacs в Вашей машине (редактирующий удаленные файлы, смонтированные с sshfs).

Другим решением была бы установка emacs в удаленной машине и копии Ваша конфигурация (я выбрал это решение, агрегированное в мерзавце repo для моего материала энергии),

4
23.07.2014, 01:47
2 ответа

Для передачи путей к файлу в качестве аргументов к команде, 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.

4
27.01.2020, 20:52

С помощью zsh:

print -r -- **/*.csv(D:a:q)

Обратите внимание, что некоторые символы (такие как новая строка, табуляция или непечатаемые) выводятся с нотацией $'...', что может быть проблемой для вас.

Другой подход:

print -r -- *.csv(e/'REPLY=${(qq)REPLY:a}'/)

Где все пути к файлам заключены в одну кавычки.

2
27.01.2020, 20:52

Теги

Похожие вопросы