как использовать vim, чтобы открыть каждый.txt файл в директории (с Bash)
Я пытаюсь использовать vim
, чтобы открыть каждый файл txt
в текущем каталоге.
find . -name "*.txt" -print | while read aline; do
read -p "start spellchecking fine: $aline" sth
vim $aline
done
Запуск его в bash
жалуется с
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
Может ли кто-нибудь объяснить, что может пойти не так? Кроме того, я намерен использовать read -p
для подсказки перед использованием vim, без успеха.4 ответа:
Попробуйте:
vim $( find . -name "*.txt" )
Чтобы исправить свое решение, вы можете (вероятно) сделать:
find . -name "*.txt" -print | while read aline; do read -p "start spellchecking fine: $aline" sth < /dev/tty vim $aline < /dev/tty done
Проблема заключается в том, что весь цикл while принимает свои входные данные от find, и vim наследует этот канал в качестве своего stdin. Это один из способов заставить вход vim поступать с вашего терминала. (Хотя не все системы поддерживают
/dev/tty
.)
С помощью
shopt -s globstar
можно очистить find и таким образом заставить bash не выполнять vim в подрешетке, которая получает выходные данные из find:shopt -s globstar shopt -s failglob for file in **/*.txt ; do read -p "Start spellchecking fine: $file" sth vim "$file" done
. Другая идея заключается в использовании
for file in $(find . -name "*.txt") ; do
(в случае отсутствия имен файлов с пробелами или новыми строками.)
Часто самое простое решение является лучшим, и я считаю, что это так:
vim -o `find . -name \*.txt -type f`
- тип f должен гарантировать только окончание файлов .txt открываются, поскольку вы не исключаете возможность того, что могут существовать подкаталоги, имена которых заканчиваются на ".формат txt".
Это откроет каждый файл в отдельном окне / bufer в vim, если вы не нуждаетесь в этом и довольны использованием :next и: prefix для навигации по файлам, удалите "- o"из предложенной выше командной строки.
Правильный способ открыть все файлы в одном экземпляре
vim
(при условии, что количество файлов не превышает максимальное число аргументов):find . -name '*.txt' -type f -exec vim {} +
Еще одна возможность, которая полностью отвечает OP, но с тем преимуществом, что она безопасна в отношении имен файлов, содержащих пробелы или забавные символы.
find . -name '*.txt' -type f -exec bash -c 'read -p "start spellchecking $0"; vim "$0"' {} \;