Как 'определить местоположение' нескольких файлов и открыть их в энергии?

Попытайтесь использовать двойные кавычки вместо сингла. http://www.gnu.org/s/bash/manual/html_node/Double-Quotes.html

Или запись его этот путь:

myawk () { awk '{print '"$1"' }'; }

Но я вижу много плохих побочных эффектов с попыткой включать необработанные пользовательские строки. Например:

myawk '"hello"; system("echo there")"

Это оценить как awk '{print "hello"; system("echo there") }', который может отобразиться "привет" и "там; но более злонамеренные команды могли быть отправлены если не оставленные правильно.

10
18.02.2015, 14:44
3 ответа

Можно использовать xargs:

locate filename123 | xargs vi

По умолчанию xargs выполнит как можно меньше экземпляров указанной команды, передавая как можно больше параметров согласно ARG_MAX системы. Ограничить количество параметров передало экземпляру vi, использовать xargs' -n опция.

Обработать имена файлов, содержащие использование пробелов xargs' -d опция:

locate filename123 | xargs -d '\n' vi

Обработать имена файлов, содержащие использование новых строк xargs' -0 опция вместе с locate -0 опция:

locate -0 filename123 | xargs -0 vi

(Если -0 не доступно ни на одном из них, проверьте на --null также, или другой способ указать символ \000 как разделитель.)

12
27.01.2020, 20:01
  • 1
    можно ли сказать мне, что то, что предотвращало меня прежде для открытия этого файла? –  Santosh Kumar 18.08.2012, 15:02
  • 2
    @Santosh Вы передавали вывод locate управляйте, как введено к vi. Vi, как любая другая программа, ожидает, что название файла (файлов) продолжит работать как аргументы. –  Gilles 'SO- stop being evil' 18.08.2012, 15:13
  • 3
    @manatwork, который проблема, я не могу определить местоположение и открыть имя файла с пробелами в ней. Например, эта команда откроет несколько файлов в энергии: найдите I\have\to\загрузка | обновленный Ответ xargs vi –  Santosh Kumar 18.08.2012, 15:40

Вы могли использовать расширение команды:

vi "$(locate filename123 | head -n1)"

Сделать vim считайте его stdin, который можно сделать vim -, но это просто даст Вам вывод locate которые являются путями имени файла. Это могло бы работать хотя, с помощью vim gf нормальная команда затем откроет путь, что курсор идет.

Править

В случае имен файлов с пробелами в них Вы лучше из использования xargs опция упоминается или vim решение, описанное выше. Отметьте для создания gf работайте необходимо добавить пространство к isfname:

set isfname+=32

Эта подсказка и альтернативы описаны здесь.

Редактирование 2

Добавленные кавычки и head как предложено PeterO в комментариях.

3
27.01.2020, 20:01
  • 1
    Для файла с пробелами в них, когда я вставляю \в имя файла, как vi $ (определяют местоположение another\файла). Энергия открывает его как два отдельных файла, another и file :(. –  Santosh Kumar 18.08.2012, 15:20
  • 2
    Ваш ответ только работает, когда у меня нет пробелов в файле, которого я определяю местоположение. –  Santosh Kumar 18.08.2012, 15:25
  • 3
    . –  Thor 18.08.2012, 15:45
  • 4
    @Thor: Для единственного файла, как упомянуто в вопросе, просто необходимо перенести кавычки вокруг замены процесса: vi "$(locate filename123)" ... Чтобы гарантировать, что это имеет только одно имя файла для контакта с: vi "$(locate filename123 |head -n1)" –  Peter.O 18.08.2012, 20:49
  • 5
    PeterO: Вы правы, я только протестировал с несколькими хитами. Я добавил Ваши комментарии к ответу. –  Thor 18.08.2012, 21:29

Самый простой способ - передать locate как подстановку оболочки , например:

vim $(locate filename123)

Вы также можете использовать find вместо locate для передачи имен файлов для редактирования, например:

find . -name 'filename123' -exec vim {} +

В Unix / OSX вы можете использовать xargs с параметром -o , например:

locate filename123 | xargs -o vim

-o Повторно откройте stdin как / dev / tty в дочернем процессе перед выполнением команды. Это полезно, если вы хотите, чтобы xargs запускал интерактивное приложение.

Или в Linux попробуйте следующее обходное решение, используя:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Если вы используете другие команды, используйте подстановку команд , чтобы добиться этого, например:

vim $(locate filename123)
vim `locate filename123`

В качестве альтернативы используйте GNU parallel ] вместо xargs , чтобы принудительно выделить tty, в примере:

locate filename123 | parallel -X --tty vi

Примечание: parallel в Unix / OSX не будет работать, поскольку он имеет другие параметры и не поддерживает tty .

Многие другие популярные команды также обеспечивают выделение псевдо-tty (например, -t в ssh ), поэтому обратитесь за помощью.

Другим предложением было бы использовать vipe (командный канал Vim) или следующий простой скрипт:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

Связанный:

1
27.01.2020, 20:01

Теги

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