如何将“yes”与“xargs -p”一起使用?

如何将“yes”与“xargs -p”一起使用?

假设我有ls | xargs -n1 -p rm,我如何使用yesyes n来自动回答该标志生成的问题-p

我尝试过yes n | (ls | xargs -n1 -p rm)但没有成功。

更新: 问题不是真正的问题rm,而是如何yes正确使用的问题。我有一个别名或一个使用的函数xargs -p,我喜欢它在执行之前询问我并向我显示它正在做什么。当我知道它会做什么时,我希望能够yes自动遍历xargs -p函数中的所有内容。因此,尽管该示例使用了rm,但它并不是真正的内容。

另外,为了特别清楚,我不想修改我的别名或函数来使用或不使用-p.我宁愿只是从外部输入 yes。

老实说,我以为类似yes | some_function_asking_me_questions或 的东西some_function_asking_me_questions <( yes )会起作用,但事实并非如此。

第二次编辑:另一个例子:我有一个别名来列出某个区域中的 AWS SNS 主题,例如:

alias delete_snstopics="list_sns | cut -f 2 | xargs -n1 -p aws sns delete-topic --topic-arn "

然后我有一个函数,可以为 AWS 中的每个区域查找并提示删除这些 SNS 主题。我想看到aws sns delete-topic --topic-arn $1xargs 会运行,因为 SNS 主题的 id 每次都不同,如果出现问题,我可以在 Web 控制台中匹配 SNS id。此外,有时我可能不想删除特定区域的 SNS 主题。这就是为什么我想使用yes这个函数,这样我就可以使用相同的函数进行部分删除和完全删除,并且仍然获得有用的输出。说得通?

答案1

让我们分析一下你的命令:

yes n | (ls | xargs -n1 -p rm)

管道ls | xargs -n1 -p rm读取ls标准输入,但将标准输出重定向到xargs,将其作为标准输入,并且其标准输出不变。

现在您将 的输出通过管道传输yes到此管道中。由于该管道的标准输入进入ls,它甚至不读取它,xargs因此看不到任何内容。

现在明显的问题是:如何xargs询问你是否执行该命令?毕竟,它的标准输入(程序通常读取用户交互的地方)被重定向以读取ls!的输出。

好吧,答案是xargs通过直接打开终端文件来绕过这些问题的重定向机制/dev/tty。因此确认输入不受文件重定向的影响。

要输入到xargs,您需要一个程序,该程序可以通过该程序控制的终端设备来呈现该过程。一个非常强大(但也相当复杂)的程序是expect.不幸的是我不知道更简单的方法来实现你想要的。

答案2

您可以使用:

ls | xargs -n1 rm -r

这适用于目录或/和文件。

相关内容