xargs направить вывод команды ls - PullRequest
2 голосов
/ 29 декабря 2011

Я запускаю команду

ls *my_file.txt* | xargs vim

Снаряд выдает предупреждение:

Vim: Warning: Input is not from a terminal

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

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

Ответы [ 5 ]

3 голосов
/ 29 декабря 2011

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

vim *my_file.txt*

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

Согласно этому обсуждению здесь , 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 увидит это как пять разных аргументов.

3 голосов
/ 29 декабря 2011

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

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

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

2 голосов
/ 18 ноября 2012

"ls my_file.txt * | vim -" (обратите внимание на черту в конце)

не уверен, как это сделать на BSD, хотя.

1 голос
/ 16 сентября 2013

"ls my_file.txt * | vim -"

не будет работать в bash, поскольку vim рассматривает его как содержимое файла, а не как имя файла.

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

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

ls * my_file.txt * | xargs vim

или

vim $ (ls * my_file.txt *)

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

0 голосов
/ 13 февраля 2017

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

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

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

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

...