24

Я часто делаю что-то, выполняя команду find, а затем редактирую их все в vi, что выглядит примерно так:

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

Есть ли умный и простой способ сделать все это в одной командной строке?

5 ответов5

37

Это должно сделать трюк:

find . -name "*.txt" -exec vim {} + 

Используйте Vim, это лучше для вашего здоровья. :-)

Опция oft-overlooked + для -exec приводит к тому, что все имена файлов (вплоть до ограничений на длину строки) отображаются в одной строке, т.е. все файлы открываются в одном сеансе vim (навигация осуществляется с помощью :n для следующего и :N для предыдущего файла) ,

С помощью vim -p вы получаете вкладку для каждого файла. Проверьте :help tab-page-commands для более подробной информации.

С vim -o вы получите горизонтально разделенные окна для каждого файла, vim -O вертикально разделенные окна. Проверьте :help window-move-cursor для более подробной информации.

Обратите внимание, что предыдущая версия этого ответа, vim $(find . -name "*.txt") , не работает с пробелами в именах файлов и имеет последствия для безопасности.

Трубопровод в xargs vi выдает Warning: Input is not from a terminal , а от терминала с полностью поддельным поведением. Пользователь объяснил почему в комментарии ниже, и немного больше объяснений в этом вопросе.

4

Или запустить vim и оттуда:

:args **/*.txt
1

Кроме того, если вы хотите, чтобы они открывались по одному, вы также можете использовать find -exec или использовать простой цикл for. Отредактировано согласно комментарию ceving.

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

или же

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS
0

Если вы уже набрали вашу команду find Я считаю , что это может быть намного проще в использовании xargs , чтобы открыть результаты поиска:

find . -name "*.txt" | xargs vim -p

Опция -p указывает vim открывать каждый файл на новой вкладке. Я считаю это более удобным, чем просто использование буферов, но если вы этого не сделаете, просто отключите эту опцию.

0

Чтобы редактировать все *.txt , вы можете просто запустить: vim *.txt . Чтобы редактировать файлы, возвращаемые функцией find , читайте дальше.


В Unix/macOS вы можете использовать find с BSD xargs (см. man xargs), например

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-o (xargs): заново открыть стандартный ввод как /dev /tty в дочернем процессе перед выполнением команды.

Связанный: Терминал заблокирован после вызова Vim с xargs в Vim.SE.

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