我想在文件夹中查找一个文件/opt
并向其发送一些文本。我尝试了以下语法:
sudo find /opt -name filename-*.conf | xargs -I '{}' echo "text_to_send" > '{}' \;
{}
不幸的是,之后我找到了包含文本的文件。我尝试在命令中使用以及、、、但是,但似乎没有任何东西可以正确地用作找到的文件名的占位符。正确的语法是'{}'
什么{}
?"{}"
\{\}
答案1
尝试这个:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
bash -c
为了将重定向>
放在引号中,这是必要的find -exec
。
答案2
我认为>
是在当前 shell 中解释的。这同样适用于*
,即如果你碰巧filename-A.conf
在当前目录中有(或更糟:更多匹配文件),那么 shell 通配符将进一步破坏你的命令。另请注意:你的仅sudo
适用于find
,而不适用于xargs
。
尝试一下(sudo
如果需要的话):
find /opt -name 'filename-*.conf' -print0 | xargs -r0 sh -c 'echo "text_to_send" | tee "$0" "$@"' > /dev/null
警告: tee
将覆盖文件(就像>
这样做一样,所以我想这就是你想要的);用于tee -a
附加。
find -print0
甚至xargs -0
可以使用奇特的文件名,xargs -r
如果找不到文件则不会运行,sh
处理内管,$0" "$@"
以安全的方式将所有文件名(由 后缀xargs
)传递给下面的命令,sh
tee
处理找到的一个或多个文件,- 最后的重定向是为了防止
text_to_send
出现在您的终端中。