Я часто делаю что-то, выполняя команду find, а затем редактирую их все в vi, что выглядит примерно так:
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
Есть ли умный и простой способ сделать все это в одной командной строке?
xargs
разрушил мою оболочку терминала. Правильное решение - нижеприведенное @DevSolarОтветы:
Это должно сделать трюк:
Используйте 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
плюс плюс терминал с полностью поддельным поведением впоследствии. Пользователь объяснил, почему в комментарии ниже, и немного больше объяснений в этом вопросе .источник
/dev/tty
и вызвать ioctl () для этого; просто лень это делать.) При вызове xargs vim получает в/dev/null
качестве стандартного ввода, которое просто игнорирует ioctl управления терминалом.vim -p
если вы хотите вкладки файлов. (gt
иgT
для навигации, или щелкните мышью.)vim
, просто укажите-
в качестве первого аргумента, как вecho foobar | vim -
.find . -name "*.txt" | vim -
дает вам сеанс vim для неназванного файла, содержащего имена найденных файлов, что не является тем, о чем просил OP ...Или запустить vim и оттуда:
источник
Кроме того, если вы хотите, чтобы они открывались по одному, вы также можете использовать find -exec или использовать простой цикл for. Отредактировано согласно комментарию ceving.
или
источник
-name
отсутствует. И второе: команда с треском проваливается, как только имя файла содержит пробел. -1 за опрометчивый ответ.Если вы уже набрали свою
find
команду, я обнаружил, что ее гораздо проще использоватьxargs
для открытия результатов поиска:-p
Опция указывает Vim , чтобы открыть каждый файл в новой вкладке. Я считаю это более удобным, чем просто использование буферов, но если вы этого не сделаете, просто отключите эту опцию.источник
Для того, чтобы изменить все
*.txt
, что вы можете просто запустить:vim *.txt
. Чтобы редактировать возвращенные файлыfind
, читайте дальше.В Unix / macOS вы можете использовать
find
с BSDxargs
(см .man xargs
:), напримерСвязано: Терминал заблокирован после вызова Vim с xargs на Vim.SE.
источник