我正在尝试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 密码,它将失败(并且可能不会告诉您原因)。