Каждый раз, когда мне нужно найти файл и затем открыть его, я должен использовать: find ./ -name ****. Properties. , затем скопируйте результат, а затем vi "вставьте результат сюда". Если мне нужно использовать мышь, это может быть немного неприятно. Так есть ли лучший способ сделать это?
7 ответов
find . -name \*.properties | xargs -d '\n' vi
откроет все файлы в одном экземпляре vi . Чтобы открыть только первое, используйте
find . -name \*.properties | head -1 | xargs -d '\n' vi
Если вы измените свою оболочку на 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])
Вы можете открыть произвольный файл, используя 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 возвращаются немного быстрее, если имеется большое количество файлов.
Вы можете посмотреть опцию -quit для команды find . Следующее может быть примером того, чего вы хотите достичь:
find . -name "*.properties" -print -exec vi {} \; -quit
Я должен отметить, что, как я обнаружил вскоре после публикации этого ответа, ключ -quit не существует для BSD-версии команды find , которую вы, вероятно, найдете, например, в MacOS.
Я думаю, что кто-то показал ответ:
find -name * .properties -exec vi {} \;
это будет последовательность редактирования файлов, найденных с помощью команды "find -name * .properties".
Если вы просто хотите открыть второй файл:
vi "$(find -name * .properties | awk 'NR == 2')"
find . -name "*.properties" -exec vi {} \;
Затем используйте ключ прерывания (например, ^ C) после редактирования первого файла.
Вы можете поместить результаты команды find в командную строку для vi следующим образом:
vi $(find . -name \*.properties -print)
или вот так:
vi $(find -name \*.properties)
с тех . и -print подразумеваются, если не указаны. Чтобы открыть только первый результат, используйте
vi $(find -name \*.properties | head -1)
