2011-12-29 4 views
2

Я выполнив командуxargs к трубе на выходе логинсервера команды

ls *my_file.txt* | xargs vim 

Оболочка Броски предупреждающее сообщение:

Vim: Warning: Input is not from a terminal 

следующие действия, что файл открыт. Обратите внимание, что есть только один экземпляр * my_file.txt *. При выходе из файла я вижу, что на каждом ENTER приглашение не находится на следующей строке, но продолжается в той же строке. Символы не набираются на дисплее, а буферизуются и выполняются при последующем вводе. В основном, дисплей становится чересчур.

Цель состоит в том, чтобы направить искомое имя файла на vim. Поэтому любые альтернативные решения приветствуются.

+0

Если my_file.txt имеет только один экземпляр, почему бы не сделать непосредственно 'vim my_file.txt'? –

+0

Идея ls * my_file.txt * заключается в том, чтобы получить одно имя файла из списка файлов. Я знаю, что этот поиск по шаблону приведет к единому результату. Результирующее имя файла должно быть отредактировано/просмотрено в vim, объединяя две команды с одной командой, проводя вывод. –

ответ

3

Используйте find и exec вместо xargs.

find /search/path/ -type f -name "*my_file.txt*" -exec vim {} \; 

Вы можете добавить больше вариантов find как -depth, чтобы ограничить перемещения рекурсивно, -regex для сложных регулярных выражений для поиска файлов и т.д.

3

Я не полностью уверен, что я понимаю, что вы делаете , Если вы просто хотите, чтобы редактировать все *my_file.txt* файлы, используйте:

vim *my_file.txt* 

Нет необходимости возиться с find или xargs. Единственная проблема, с которой вы столкнетесь, - это то, что у вас так много файлов этой формы, что вы взорвите границы командной строки. Но, серьезно, вы, вероятно, не захотите редактировать это множество файлов.

В соответствии с этим обсуждением here, vim не является одной из тех программ, которые вы можете легко воспроизводить с помощью стандартного ввода и вывода (по крайней мере, в режиме vi - ex-режим может отличаться).

Вы можете увидеть подобную проблему с делать такие вещи, как:

`vi filename` 
$(vi filename) 
vi filename </dev/null 

В принципе, vim не означает иметь его STDIN/STDOUT сброшенные о с, это интерактивный редактор и ожидает, что оконечное устройство. Последствия, которые вы видите, вероятно, либо curses, либо vim сами не очищают настройки stty.

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

vim $(arbitrarily_bizarre_command_which_outputs_filenames) 

, имея в виду, что вывод простой текст замена поэтому не будет легко работать с файлами например my list of porn sites.txt (с пробелами в них). vim увидит это как пять разных аргументов.

+0

Настоящий К.И.С.С. философии. :) –

2

"Ls my_file.txt * | ВИМ -" (обратите внимание на дефис в конце)

не знаю, как сделать это на BSD, хотя.

1

"ls my_file.txt * | ВИМ - «

не будет работать в Баш, так как ВИМ рассматривает его как содержимое файла, а не имя файла

найти/поиск/путь/-типа ф -name» * my_file. TXT *»-exec ВИМ {} \;.

обратите внимание, что это будет редактировать файлы по одному за раз, если вы все еще хотите отредактировать несколько файлов в различных буферов, вы должны по-прежнему использовать

ls * my_file.txt * | xargs Vim

или

ВИМ $ (Ls * my_file.txt *)

при условии, что выход подходит в качестве параметра командной строки максимальной длины.

0

другое решение:

ls *my_file.txt* 
vim $(!!) 

!! будет повторять команду, которая была выполнена до этого, $() будет вставлять вывод команды в командной строке.

Осторожно: не работает с именами файлов, которые содержат пробелы или другие неприятные символы.

Смежные вопросы