Як `знайти` декілька файлів і відкрити їх у vim?


10

Припустимо, у мене є файл з ім'ям, filename123.txtі саме той файл названий так, і я можу locateце за допомогою команди locate filename123. І він повертає лише цей файл.

Тепер я хочу відкрити його vi/ vim. Але я не хочу переходити до цього місця і вводити viкоманду, а потім ім'я файлу. Тут я хочу, щоб результат locate filename123був доданий до команди vi. Як я можу це зробити? Я вже спробував:

locate filename123 | vi

Але це не працює. І ця помилка надходить у терміналі:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

Відповіді:


12

Ви можете використовувати xargs:

locate filename123 | xargs vi

За замовчуванням xargsбуде виконано якомога менше екземплярів зазначеної команди, передаючи якомога більше параметрів відповідно до ARG_MAX системи . Щоб обмежити кількість параметрів, переданих екземпляру vi, використовуйте опцію xargs' -n.

Для обробки імен файлів, що містять пробіли, використовується опція xargs'-d

locate filename123 | xargs -d '\n' vi

Для обробки імен файлів, що містять нові рядки, використовуйте параметр xargs' -0разом із опцією locate' s -0:

locate -0 filename123 | xargs -0 vi

(Якщо -0немає в жодному з них, перевірте --nullтакож, чи інший спосіб вказати символ \000як роздільник.)


Чи можете ви сказати мені, що саме мені заважало відкрити цей файл?
Сантош Кумар

1
@Santosh Ви передавали висновок locateкоманди як вхід vi. Vi, як і будь-яка інша програма, очікує, що ім'я файлу (файлів) буде працювати як аргументи.
Жил 'SO- перестань бути злим'

@manatwork Проблема в тому, що я не можу знайти і відкрити ім'я файлу з пробілами. Наприклад, ця команда відкриє декілька файлів у vim: знайдіть I \ have \ to \ download | xargs vi
Сантош Кумар

3

Ви можете використовувати розширення команд:

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

Щоб змусити vimпрочитати його stdin, ви можете зробити vim -, але це просто дасть вам вихід з locateяких є шляхи до імені файлів. Це може працювати, хоча vim gfзвичайна команда відкриє шлях, на якому курсор.

Редагувати

У випадку назви файлів з пробілами в них краще використовувати xargsвказаний варіант або vimрішення, описане вище. Зауважте, щоб зробити gfроботу потрібно, щоб додати місця для isfname:

set isfname+=32

Ця порада та альтернативи описані тут .

Редагувати 2

Додано цитати та headяк запропонував PeterO у коментарях .


Для файлу з пробілами в них, коли я вставляю \ у ім'я файлу, як-то vi $ (знайдіть інший \ файл). Вим відкриває його у вигляді двох окремих файлів anotherі file:(.
Сантош Кумар

Ваша відповідь працює лише тоді, коли у мене немає пробілів у файлі, який я знаходжу.
Сантош Кумар

Відповідь оновлено.
Тор

2
@Thor: Для одного файлу, про який було сказано в запитанні, вам потрібно просто обернути лапки навколо процесу заміни: vi "$(locate filename123)"... Щоб переконатися, що в ньому є лише одне ім'я файлу, з яким слід мати справу:vi "$(locate filename123 |head -n1)"
Peter.O

PeterO: Ти маєш рацію, я протестував лише декілька хітів. Я додав ваші коментарі до відповіді.
Тор

1

Найпростіший спосіб - пройти 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 "$@"

Пов'язані:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.