gpt4 book ai didi

linux - 在目录中查找文件,使用 execdir 执行命令并重定向

转载 作者:太空狗 更新时间:2023-10-29 11:09:41 26 4
gpt4 key购买 nike

看来我无法找到这个问题的直接答案。感谢您的帮助。

我正在尝试在目录中查找具有特定名称的所有文件,读取文件的最后 1000 行并将其复制到同一目录中的新文件中。例如:

Find all files names xyz.log in the current directory, copy the last 1000 lines to file abc.log (which doesn't exist).

我尝试使用以下命令但没有成功:

find . -name "xyz.log" -execdir tail -1000 {} > abc.log \;

我遇到的问题是,对于当前目录中的所有文件,它们都写入 CURRENT 目录中的 abc.log,而不是 xyz.log 所在的目录。很明显,首先执行带有 execdir 的查找,然后将输出重定向到 abc.log。

你们能建议一个解决这个问题的方法吗?我感谢任何信息/帮助。

编辑 - 我试过 find 。 -name "xyz.log"-execdir sh -c "tail -1000 {} > abc.log"\; 按照一些 friend 的建议,但它给了我这个错误: sh: 。/tail: No such file or directory 错误信息。你们知道问题出在哪里吗?

幸运的是,使用 -printf 的解决方案运行良好。

最佳答案

最简单的方法是这样的:

find . -name "xyz.log" -execdir sh -c 'tail -1000 "{}" >abc.log' \;

一个更灵活的选择是先打印出命令,然后用sh 执行它们:

find . -name "xyz.log" -printf 'tail -1000 "%p" >"%h/abc.log"\n' | sh

您可以删除| sh 在您尝试/调试时从最后开始。

有一个bug在某些版本的 findutils(4.2 和 4.3,虽然它在某些 4.2.x 和 4.3.x 版本中已修复)导致包含 {} 的 execdir 参数以 ./(前缀不是仅应用于 {},而是应用于整个带引号的字符串)。要解决此问题,您可以使用:

find . -name "xyz.log" -execdir sh -c 'tail -1000 "$1" >abc.log' sh {} \;

sh -c 'script' arg0 arg1 运行 sh script 并传递给它的 arg0、arg1 等。按照惯例,arg0 是可执行文件的名称(此处为“sh”)。从脚本中,您可以使用 $0(对应于“sh”)、$1(对应于 {} 的查找扩展)访问参数,等

关于linux - 在目录中查找文件,使用 execdir 执行命令并重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17243974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com