web-dev-qa-db-ja.com

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

findhome-pi-units-manager.service.mountを出力するときに、なぜこの/home/pi/units/manager.serviceを実行しようとしているのですか?

1
Devin

なぜ_/home/pi/units/manager.service_を実行したいのですか?それはサービスの名前ではありません!これがサービスファイルへのパスです。サービスのみを出力に残すには、サービス名のパスを削除する必要があります。あなたのサービスの名前はどうやら→_manager.service_です

Devinが言ったように、findは完全に正常に機能しています。あなたが読むことができるようにそれは文字翻訳をしているsystemDです。ここ→ freedesktop.org --systemd-documentation

エスケープアルゴリズムは次のように動作します。文字列を指定すると、「/」文字はすべて「-」に置き換えられ、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}')

..そしてplzは質問を言い換えます。確かに誤解を招きます!

2
tobi

それが私の友人にとっての「-exec」です。これはあなたのカードですか?

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

もちろん、「-printf」を使用してシェル(sh)にパイプすることもできます。

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

編集:また、スクリプトを作成するときは、Sudoの認証要件に注意してください。このようにSudoブランクを使用していて、そのセッションでSudoパスワードをまだ入力していない場合、失敗します(おそらく理由はわかりません)。

0
AenAllAin