как использовать 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 5

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"' {} \;