与 find 类似的命令输出的结果不一样

与 find 类似的命令输出的结果不一样

我正在尝试find在包含单元文件的目录上运行命令:

find /home/pi/units -type f -name "*.service"

返回

/home/pi/units/manager.service

然后我想将该输出导入到find命令中以启用该目录中的所有内容。我尝试了几种不同的方法,但都不起作用:

$ sudo systemctl start $(find /home/pi/units -type f -name "*.service")
Failed to start home-pi-units-manager.service.mount: Unit home-pi-units-manager.service.mount not found.

$ find /home/pi/units -type f -name "*.service" | xargs sudo systemctl start
Failed to start home-pi-units-manager.service.mount: Unit home-pi-units-manager.service.mount not found.

$ find /home/pi/units -type f -exec sudo systemctl start {} \;
Failed to start home-pi-units-manager.service.mount: Unit home-pi-units-manager.service.mount not found.

我希望它运行:

sudo systemctl enable /home/pi/units/manager.service
sudo systemctl start /home/pi/units/manager.service

为什么在输出home-pi-units-manager.service.mount时尝试运行它find/home/pi/units/manager.service

答案1

你为什么要运行它/home/pi/units/manager.service?这不是服务的名称!这是服务文件的路径。你需要删除服务名称中的路径,这样输出中就只剩下服务了。你的服务名称显然是 →manager.service

正如 Devin 所说,find运行完全正常。它systemD正在进行字符翻译,您可以在此处阅读 →freedesktop.org - systemd 文档

转义算法的操作如下:给定一个字符串,任何“/”字符都将被“-”替换,并且所有其他非 ASCII 字母数字或“_”的字符都将由 C 样式的“\x2d”转义替换。此外,当“.”作为转义字符串中的第一个字符出现时,它将被替换为这种 C 样式的转义。

然而,你需要注意的更重要的部分是,不要systemctl使用服务文件的完整路径运行命令。您只需使用实际的服务名称,因此 systemctl start manager.service
,只需从输出中删除路径find就可以了。

例如:
$ sudo systemctl start $(find /home/pi/units -type f -name "*.service" | awk -F/ '{print $NF}')

..请重新措辞问题。这确实具有误导性!

答案2

这就是我朋友所说的“-exec”。这是你的卡吗?

sudo find /home/pi/units -type f -name "*.service" -exec sudo systemctl start {} \;

当然你也可以使用‘-printf’并将其通过管道传输到 shell (sh):

sudo find /home/pi/units -type f -name "*.service" -printf 'sudo systemctl start %p\n' | sh

编辑:此外,编写脚本时请注意 sudo 的身份验证要求。如果您像这样使用 sudo blank,并且您尚未在该会话中输入 sudo 密码,它将失败(并且可能不会告诉您原因)。

相关内容