6

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.

誰かがおそらくうまくいかない可能性があることを説明できますか?また、vimを使用する前にpromptを使用するつもりですがread -p、成功しません。

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 がそのパイプを stdin として継承することです。これは、vim の入力を端末から取得するための 1 つの手法です。(ただし、すべてのシステムが をサポート/dev/ttyしているわけではありません。)

于 2012-11-25T21:55:05.523 に答える
1

これshopt -s globstarを使用すると、findを削除して、findからの出力を受け取るサブシェルでbashが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

1つの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 に答える