一起使用 find 和 aspell

一起使用 find 和 aspell

我试图对*.md当前目录中的所有文件进行拼写检查,但以下命令失败:

>> find . -maxdepth 1 -name "*.md" | xargs -I {} aspell check {}
xargs: aspell: exited with status 255; aborting

我假设这是因为aspell需要stdin与用户交互但不知何故xargs没有提供它。我找到了一个黑客攻击推特,

find . -maxdepth 1 -name "*.md" | xargs -n 1 xterm -e aspell check

但这每次都会打开一个新的 xterm。如何让原始命令像单独运行aspellfind 命令的结果一样工作?

答案1

  • xargs你根本不需要,只需使用exec选项:

    find . -maxdepth 1 -name "*.md" -exec aspell check {} \;
    
  • 以防万一您或任何未来的读者确实需要使用xargs- 您可以通过生成新的 shell 并从终端 ( /dev/tty) 获取标准输入来做到这一点:

    find . -maxdepth 1 -name "*.sh" | xargs -n1 sh -c 'aspell check "$@" < /dev/tty' aspell
    

答案2

你总是可以只使用一个简单的循环:

for f in *.md; do aspell check "$f"; done

答案3

我同意,使用xargswithfind是多余的,但是如果输入来自其他东西而你要使用xargs,只需使用-o

grep -rl 'draft: false' | xargs -o -n1 aspell check --sug-mode=slow

man xargs有这样说:

-o 在执行命令之前,在子进程中将 stdin 重新打开为 /dev/tty。如果您希望 xargs 运行交互式应用程序,这非常有用。

相关内容