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

2024-11-08 09:04:00
admin
原创
26
摘要:问题描述:我有一个只将数据写入的脚本stdout。我需要对多个文件运行它并为每个输入文件生成不同的输出文件,我想知道如何使用find -exec它。所以我基本上尝试了它的几种变体(我替换了脚本只是cat为了可测试性目的):find * -type f -exec cat "{}" >...

问题描述:

我有一个只将数据写入的脚本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?欢迎​​使用其他单行代码。


解决方案 1:

你可以用 eval 来做。这可能很丑陋,但为此编写一个 shell 脚本也是一件很丑陋的事情。另外,这一切都在一行上。例如

find -type f -exec bash -c "eval md5sum {}  > {}.sum " ;

解决方案 2:

一个简单的解决方案就是给你的脚本加上一个包装器:

#!/bin/sh

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

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

find . -type f -exec myscript2 {} ;

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

解决方案 3:

如果您导出环境变量,它们将已经存在于子 shell 中(如果您使用bash -c而不是sh -c,并且您的父 shell 本身是 bash,那么您也可以导出父 shell 中的函数并让它们在子 shell 中使用;请参阅export -f)。

此外,通过使用-exec ... {} +,您可以将 shell 的数量限制为在命令行上传递所有参数所需的最小可能数量:

set -a # turn on automatic export of all variables
source initscript1
source initscript2

# pass as many filenames as possible to each sh -c, iterating over them directly
find * -name '*.stdout' -prune -o -type f \n  -exec sh -c 'for arg; do myscript "$arg" > "${arg}.stdout"' _ {} +

或者,您可以直接在当前 shell 中执行:

while IFS= read -r -d '' filename; do
  myscript "$filename" >"${filename}.out"
done < <(find * -name '*.stdout' -prune -o -type f -print0)

请参阅UsingFind讨论如何通过 ; 安全正确地执行批量操作find,以及BashFAQ #24讨论如何使用进程替换(<(...)语法)来确保操作在父 shell 中执行。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用