web-dev-qa-db-ja.com

findコマンドで-execオプションを使用する方法

私はbrainhandscompizのいくつかの問題を解決したい。

ところで、Ubuntu 12.04のソースからcompizをビルドするために次のコマンドを入力しました

find /opt/compiz-built/share/gconf/schemas -exec gconftool-2 --install-schema-file={};

http://www.brazzi64.net/blog/building-compiz-from-source-in-ubuntu-12-04/ でそのコマンドを参照しました

そして、次のメッセージが表示されます。

Findコマンドで-execオプションを使用する方法、それは私の間違いだと思います。

3
xiaodongjie

あなたはほとんどそこにいます。コマンドの終わりがどこにあるかを見つけるために、終わりに\;が必要です。

find /opt/compiz-built/share/gconf/schemas -exec gconftool-2 --install-schema-file={} \;

一度に複数の引数を取ることができるコマンドの場合(たとえば、各ファイル名をstatだけにしたい場合)、代わりに\+を使用できます。これにより、単一のファイルごとに分岐しないため、より高速に実行できる複合引数が作成されます。

find . -exec stat {} \+

ただし、ここでは例としては機能しません。


引用符は不要であることを強調するためのテストハーネスです。

$ mkdir 1 2 1\ 2               # makes three directories
$ touch {1,2}/single           # puts a file in each of the two singles
$ touch 1\ 2/COMBO             # puts a file in the dir with a space
$ find -type d -exec ls {} \;
1  1 2  2
single
single
COMBO

クォートを処理していなかった場合、COMBOの代わりに次のように表示されます。

1:
correct

2:
correct
6
Oli

このコマンドを使用できます。

find /opt/compiz-built/share/gconf/schemas -exec gconftool-2 --install-schema-file '{}' ';'

Findコマンドのマニュアル($ man find)によると。 delete、lsなどのfindコマンドで事前定義できるアクションがあります。

定義済みのアクションに加えて、任意のコマンドを呼び出すこともできます。これを行う従来の方法は、-execアクションを使用することです。このアクションは次のように機能します。

-exec command {} ;

ここで、commandはコマンドの名前、{}は現在のパス名のシンボリック表現、セミコロンはコマンドの終わりを示す必須の区切り文字です。

繰り返しますが、中括弧とセミコロンはシェルにとって特別な意味を持つため、引用符で囲むかエスケープする必要があります

0
prepangolin