5

Каждый раз, когда мне нужно найти файл и затем открыть его, я должен использовать: find ./ -name ****. Properties. , затем скопируйте результат, а затем vi "вставьте результат сюда". Если мне нужно использовать мышь, это может быть немного неприятно. Так есть ли лучший способ сделать это?

7 ответов7

3
find . -name \*.properties | xargs -d '\n' vi

откроет все файлы в одном экземпляре vi . Чтобы открыть только первое, используйте

find . -name \*.properties | head -1 | xargs -d '\n' vi
3

Если вы измените свою оболочку на zsh, вам нужно будет find намного реже, поскольку zsh позволяет вам делать большую часть того, что может сделать find , с помощью глобализации. Начнем с того, что **/ имеет специальное значение: **/foo расширяется до файлов с именем foo в текущем каталоге и его подкаталогах рекурсивно, то есть соответствует тем же файлам, что и find . -name foo Таким образом, вы можете редактировать все совпадения с

vi **/*.properties

Начиная с bash 4.0, если вы поместили shopt -s globstar в ~/.bashrc , **/ ведет себя точно так же.

В zsh у вас гораздо больше возможностей благодаря глобальным квалификаторам (очень кратко описанным в конце справочной страницы zshexpn). Принцип состоит в том, чтобы ограничить совпадения, добавив один или несколько классификаторов в скобках после совпадения. Например, классификатор . ограничивает обычные файлы, а / ограничивает каталоги. Спецификатор [1] сохраняет только первое совпадение; [1,4] сохраняет первые четыре матча; и так далее. Например, чтобы отредактировать первый (в лексикографическом порядке полного пути) обычный файл, соответствующий *.properties:

vi **/*.properties(.[1])

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

vi **/*.properties(.om[1])
2

Вы можете открыть произвольный файл, используя AWK или sed для печати определенного номера строки.

vi "$(find ./ -name **.properties | awk 'NR==2')"

или же

vi "$(find ./ -name **.properties | awk 'NR==2{print;quit}')"

или же

vi "$(find ./ -name **.properties | sed -n '2p')"

или же

vi "$(find ./ -name **.properties | sed -n '2{p;q}')"

Версии с quit или q возвращаются немного быстрее, если имеется большое количество файлов.

1

Вы можете посмотреть опцию -quit для команды find . Следующее может быть примером того, чего вы хотите достичь:

find . -name "*.properties" -print -exec vi {} \; -quit

Я должен отметить, что, как я обнаружил вскоре после публикации этого ответа, ключ -quit не существует для BSD-версии команды find , которую вы, вероятно, найдете, например, в MacOS.

1

Я думаю, что кто-то показал ответ:

find -name * .properties -exec vi {} \;

это будет последовательность редактирования файлов, найденных с помощью команды "find -name * .properties".

Если вы просто хотите открыть второй файл:

vi "$(find -name * .properties | awk 'NR == 2')"

0

find . -name "*.properties" -exec vi {} \;

Затем используйте ключ прерывания (например, ^ C) после редактирования первого файла.

0

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

vi $(find . -name \*.properties -print)

или вот так:

vi $(find -name \*.properties)

с тех . и -print подразумеваются, если не указаны. Чтобы открыть только первый результат, используйте

vi $(find -name \*.properties | head -1)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .