6

我正在尝试以下使用 avim打开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之前使用for prompt,但没有成功。

4

4 回答 4

12

尝试:

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 继承了该管道作为它的标准输入。这是从终端获取 vim 输入的一种技术。(但并非所有系统都支持/dev/tty。)

于 2012-11-25T21:55:05.523 回答
1

shopt -s globstar你可以清除 find ,从而使 bash 不在接收 find 输出的子 shell 中执行 vim :

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

(如果没有带有空格或换行符的文件名。)

于 2012-11-25T22:08:08.230 回答
0

通常最简单的解决方案是最好的,我相信就是这样:

vim -o `find . -name \*.txt -type f`

-type f 是为了确保只打开以 .txt 结尾的文件,因为您不排除可能存在名称以“.txt”结尾的子目录的可能性。

这将在 vim 中的单独窗口/缓冲区中打开每个文件,如果您不需要这样做并且对使用 :next 和 :prefix 浏览文件感到满意,请从上面建议的命令行中删除“-o”。

于 2012-11-25T22:28:19.713 回答
0

在一个vim实例中打开所有文件的正确方法是(假设文件数不超过最大参数数):

find . -name '*.txt' -type f -exec vim {} +

另一种完全回答 OP 的可能性,但好处是对于包含空格或有趣符号的文件名是安全的。

find . -name '*.txt' -type f -exec bash -c 'read -p "start spellchecking $0"; vim "$0"' {} \;
于 2012-11-25T22:28:32.790 回答