当前位置: 首页 > 面试题库 >

使用find -exec重定向stdout而不创建新的shell

范金鑫
2023-03-14
问题内容

我有一个仅向写入数据的脚本stdout。我需要为多个文件运行它,并为每个输入文件生成一个不同的输出文件,我想知道如何使用find -exec它。因此,我基本上尝试了几种变体(cat出于测试目的,我将脚本替换为):

find * -type f -exec cat "{}" > "{}.stdout" \;

但由于所有数据都被写入了名为的文件中,因此无法正常工作{}.stdout

最终,我可以使用它:

find * -type f -exec sh -c "cat {} > {}.stdout" \;

但是,尽管这种最新形式可以很好地使用cat,但我的脚本需要通过多个初始化脚本加载环境变量,因此我最终得到了:

find * -type f -exec sh -c "initscript1; initscript2; ...;  myscript {} > {}.stdout" \;

这似乎很浪费,因为我已经在当前shell中初始化了所有内容。

有更好的方法find吗?其他单线也欢迎。


问题答案:

一个简单的解决方案是在脚本周围放一个包装器:

#!/bin/sh

myscript "$1" > "$1.stdout"

调用它myscript2并使用find调用它:

find . -type f -exec myscript2 {} \;

请注意,尽管大多数find的实现都允许您执行已做的事情,但是如果您{}在的参数列表中多次使用find的行为,从技术上讲,其行为是不确定的-exec



 类似资料:
  • 问题内容: 我正在尝试获取查询结果并将其放入SQL Server 2017数据库中的表中。 我知道之前曾在这里,这里和这里询问过类似的问题,但是我没有找到有效的解决方案。 该查询本身运行良好,并且得到的正是我要查找的数据: 由于SQL超过8000个字符限制,我无法使用。 尝试1: 但是得到: 无法找到对象“购买”,因为它不存在或您没有权限。 尝试2: 但得到一个错误 ‘)’`附近的语法不正确。 尝

  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 问题内容: 我有一个程序Test.java: 应该将HelloWorld1和HelloWorld2打印到文件text.txt中。但是,当我查看文件时,只能看到HelloWorld1。 HelloWorld2去了哪里?它消失在稀薄的空气中了吗? 可以说我也想将HelloWorld2重定向到test.txt。我不能仅在命令中添加“ >> test.txt”,因为会出现文件已打开错误。那么我该怎么做呢?

  • 一个 exec < filename 命令重定向了 标准输入 到一个文件。自此所有 标准输入 都来自该文件而不是默认来源(通常是键盘输入)。在使用 sed 和 awk 时候这种方式可以逐行读文件并逐行解析。 样例 20-1. 使用 exec 重定向 标准输入 #!/bin/bash # 使用 'exec' 重定向 标准输入 . exec 6<&0 # 链接文件描述符 #6 到标准

  • 问题内容: 我正在尝试将printf函数的输出重定向到Windows上的文件。我在python3中使用ctypes来调用函数。我的代码是: 但是,当我从Eclipse运行代码时,屏幕上显示以下内容: …以及TEST.txt中的以下内容 当我从cmd运行此命令时,这是屏幕上显示的内容: ..这是在TEST.txt中: 当我注释掉第二条语句时,例如 在Eclipse的屏幕上: …并在TEST.txt文

  • 问题内容: 我想执行一个命令,并想重定向stderr和stdout,如下所示: stderr和stdout->仅应在保持顺序的同时写入logs.log文件 stderr->应该打印到SCREEN并也写入errors.log 到目前为止,我可以将它们重定向到屏幕和文件log.txt,如下所示: 但是以上不是我所需要的。 为了更清楚地说明结果是什么。 执行命令后,我只需要在屏幕上看到stderr的结果