web-dev-qa-db-ja.com

chown:「root:users」の後にオペランドがありません

所有者がroot:users以外の場合、所有者をディレクトリの下で再帰的にroot:usersに変更しようとします。

cd /dir/
find . \( ! -user root -o ! -group users \) -print0 | xargs -0 chown -vc root:users 

エラーが発生します:

chown: missing operand after ‘root:users’
Try 'chown --help' for more information.

エラーが発生するのはなぜですか?どうすれば修正できますか?

5
klor

Chownで再帰スイッチを使用します。

chown -R root:users dir

そして、それでうまくいくはずです。

エラーが発生する理由の詳細:findコマンドでファイルが見つからない場合、最後にオペランドなしでchownが実行され、このエラーが発生します。

元のコマンド形式を使い続けることに真剣に取り組んでいる場合は、xargsに-rスイッチを追加すると、ファイルが見つからないときにエラーが解消されます。

13
Jeff A

-Rフラグをchownに使用できるという観察結果に加えて、変更する必要のあるファイルがないため、エラーメッセージが表示される理由はほぼ確実です[1]。 。 xargsのgnuバージョンには、コマンドへの入力がない場合にコマンドを実行しないようにxargsに指示する追加のフラグ-rがあります。

ただし、xargsを使用するのは間違ったアプローチです。POSIXバージョンのfindは、コマンドをバッチ処理します。使用する

find . \( ! -user root -o ! -group users \) -exec chown -vc root:users {} +

+の使用例でよく見られる\;ではなく、最後の-execに注意してください。 \;では、コマンドは一致するファイルごとに1回実行されますが、+ではファイルがグループ化され、バッチで実行されます。

たとえば、入力から読み取り、行をペアで処理したい場合など、xargsを引き続き使用する必要がある場合がありますが、これらはまれです。ほとんどの場合、ファイルごとにコマンドを実行するか、できるだけ多くのファイルをバッチ処理して、バッチごとに1つのコマンドを実行する必要があります。

[1] xargsの実装によっては、いくつかのコマンドバッファーにファイルを正確に入力した可能性がありますが、ファイルがない可能性ははるかに高くなります。

5
icarus