所有者が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.
エラーが発生するのはなぜですか?どうすれば修正できますか?
Chownで再帰スイッチを使用します。
chown -R root:users dir
そして、それでうまくいくはずです。
エラーが発生する理由の詳細:findコマンドでファイルが見つからない場合、最後にオペランドなしでchownが実行され、このエラーが発生します。
元のコマンド形式を使い続けることに真剣に取り組んでいる場合は、xargsに-rスイッチを追加すると、ファイルが見つからないときにエラーが解消されます。
-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の実装によっては、いくつかのコマンドバッファーにファイルを正確に入力した可能性がありますが、ファイルがない可能性ははるかに高くなります。