Каждый раз, когда мне нужно найти файл и затем открыть его, я должен использовать: 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)