【问题标题】:Using find, execute command and output to new file with original filename and appended extension使用查找,执行命令并输出到具有原始文件名和附加扩展名的新文件
【发布时间】:2019-12-09 13:27:26
【问题描述】:

我有一堆文件想用find 找到。然后我想运行一个命令(输出到STDOUT)并将其写入一个带有附加扩展名的新文件。这是我目前所拥有的:

find . -name "*.txt" -exec command -O -I{} > {}.nav \;

所以说find 给了我文件列表:

./1/file1.txt
./2/file2.txt

我想要结果:

./1/file1.txt
./1/file1.txt.nav
./2/file2.txt
./2/file2.txt.nav

但我只得到一个所有内容都已连接到的新文件,名为{}.nav。关于我应该如何进行的任何提示?

【问题讨论】:

  • @andand :你知道吗,你写它的方式,选项-O -I{} 被传递给command?另外,{}.nav 是一个奇怪的文件名,但当然你可以随意命名你的文件....
  • 同意将-O -I{} 传递给command,这似乎不是您所需要的。您还可以给我们一个用于测试的命令吗?我们可以只使用echocat 代替吗?祝你好运。
  • @andad :要尝试的一件事是制作一个脚本,该脚本可以执行您制作.nav 文件所需的任何操作。我认为 > 重定向只被 shell 处理一次。如果您可以将该重定向移动到为每个文件执行的脚本中,那么您应该很好。祝你好运。
  • @user1934428 是的,我知道 -O -I{} 已传递给命令。我认为find 会用正在处理的文件名替换{}.nav 中的{}。谢谢@shellter,我以为> 会写信给<filename>.nav(即从find 找到的每个文件。谢谢大家的帮助!
  • @andand :这是正确的。因此,command 确实应该得到相应的参数。但是这个神秘的命令是什么呢?我猜你并没有在-exec 后面写上command 这个词,而是你要在这里执行的命令的实际名称。

标签: linux bash find


【解决方案1】:

您可以使用tee 命令尝试以下操作

 for file in $(find . -name "*.txt"); do <command> "$file" | tee "$file".nav; done

来自man tee

tee - 从标准输入读取并写入标准输出和文件

【讨论】:

  • 感谢 nullPointer。那么,如果不涉及 for 循环和 tee,就没有办法直接用 find 完成所有这些操作吗?
  • 感谢@nullPointer,这是最接近我所寻找的。​​span>
【解决方案2】:

如果我正确理解您的要求,如何使用awkfind 如下。

find -type f -name "*.txt" | awk '{print $0 ORS $0".nav"}'

【讨论】:

  • 谢谢@RavinderSingh13。它似乎只输出到STDOUT 而没有写入文件。
  • @and,当然,您可以将 ` > out_file` 附加到我的代码中,然后它应该写入一个文件,干杯。
【解决方案3】:

有一种方法可以在不使用 for 循环的情况下通过使用 bashtee 来实现所需的结果。由于find 将找到的每个文件的结果输出到标准输出,因此您仍然需要使用tee。例如,如果您想为每个文件对所有值为“HelloWorld”的行进行 grep,并将结果输出到单独的文件中,您可以运行以下命令:

find . -name "*.txt" -exec bash -c 'grep "HelloWorld" {} | tee "{}.nav"' \;

如您所见,上面的命令不需要 for 循环,但仍会产生所需的结果。请接受这个作为答案,因为它直接回答了您的问题,但也省略了@nullPointer 答案中的 for 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    相关资源
    最近更新 更多